rabbitmq系列(一)初识rabbitmq

为何要使用消息中间件

案例:假如咱们开发了一个商品抢购网站。这个网站的目的就是在某一时间点进行抢购商品,同时要求用户注册,在注册的时候会同时给用户电话和邮箱中发送验证码,以便完成信息注册。传统作法应该是这样的。两种方式,并行即启用两个线程,当用户提交信息后,分别去发送邮件和发送短信。这种方式很明显比串行的方式更快。当咱们加入消息队列后,处理方式以下图:java

串行并行.jpg

加入消息中间件后,咱们只须要注册信息存库后,给消息队列中添加一条消息就完事了。而后邮件服务和短信服务分别去消费消息便可。apache

消息队列.png

当用户注册完成后,到了抢购商品的时间,你们都去抢购某个商品的时候这个量很大。消息队列能够设置队列长度来保证系统的稳定性。当队列满了的时候,则再也不处理这些用户请求。segmentfault

所以咱们能够总结一下消息队列的特色:api

  1. 异步处理 -- 用户注册信息提交后,直接返回响应。而后邮件服务和短信服务监听到队列有消息后去主动处理
  2. 应用解耦 -- 用户注册流程分红了三个服务,注册服务、邮件服务、短信服务互不干扰。
  3. 流量削峰 -- 控制用户请求,以防系统奔溃。

常见消息中间件介绍

ActiveMQ:apache出品,能力强劲的开源消息总线,彻底支持jms规范的消息中间件。api丰富,在传统行业的中小型企业中应用普遍。缺点:服务性能和数据存储性能很差。服务器

Kafka:apache顶级项目,追求高吞吐量。一开始的目的是用于日志收集和传输。不支持事务,对消息重复,丢失,错误没有严格的请求。适合产生大量数据的互联网服务的数据收集业务。网络

RocketMQ:阿里开源中间件,目前已孵化成apache顶级项目,纯java开发,思路起源于kafka,对消息的可靠性传输和事务性作了优化。特色:高吞吐量、高可用。适合大规模分布式系统应用。目前在阿里集团被普遍使用,用于交易、充值,流计算,日志处理,消息推送等。如今推出了商业版,有些功能对外不开发。并发

RabbitMQ:是一个开源的消息代理和队列服务器,用来经过普通协议在彻底不一样的应用之间共享数据,RabbitMQ是使用ErLang语言来编写的,而且基于AMQP协议。erlang语言开发,性能较好,高并发。社区活跃度高,网上资料比较多。异步

什么是AMQP协议

AMQP(Advanced Message Queuing Protocol,高级消息队列协议)是一个进程间传递异步消息网络协议分布式

涉及到的具体概念:高并发

  • server - 又称broker,接收客户端的连接,实现amqp实体服务。
  • Connection - 连接,应用程序跟broker的网络连接。
  • channel - 网络信道,几乎全部的操做都是在channel中进行,数据的流转都要在channel上进行。channel是进行消息读写的通道。客户端能够创建多个channel,每一个channel表明一个会话任务。
  • message - 消息,服务器与应用程序之间传送的数据。由properties和body组成。properties能够对消息进行修饰,好比消息的升级,延迟等高级特性。body就是消息体的内容。
  • virtual host - 虚拟主机,用于进行逻辑隔离,最上层的消息路由,一个虚拟地址里面能够有多个交换机。exchange和消息队列message quene。
  • exchange - 交换机,接收消息,根据路由器转发消息到绑定的队列。
  • binding - 绑定,交换机和队列之间的虚拟连接,绑定中能够包含routing key。
  • routing key - 一个路由规则,虚拟机能够用它来肯定如何路由一个特定消息。
  • quene - 消息队列,保存消息并将它们转发给消费者。

详细了解AMQP协议可参考这篇文章--------详解AMQP协议

交换机简单介绍

exchange:接收消息,并根据路由键转发消息所绑定的队列。

交换机的属性:

name:交换机的名称

type:交换机的类型direct,topic,fanout,headers

durability:是否须要持久化,true为持久化。

auto delete:当最后一个绑定到exchange上的队列删除后,自动删除该exchange。

internal:当前exchange是否用于rabbitMQ内部使用,默认为false。

arguments:可扩展参数。用户自自定义的交换机时,用到的参数。

交换机经常使用的类型为direct,topic,fanout。headers不经常使用。

direct(直连交换机):

  1. 全部发送到directExchange的消息被转发到RouteKey中指定的Queue
  2. rabbitmq有一个自带的exchange叫default exchange,这个交换机是direct类型的。rabbitmq会让路由键跟队列名相等进行绑定。

topic(主题交换机):

  1. 全部发送到topic exchange的消息被转发到全部关心RouteKey的Queue上
  2. Exchange将RouteKey和某些队列进行模糊匹配,此时队列须要绑定一个Topic

模糊匹配可使用通配符:

#能够匹配一个或多个词

*只能匹配一个词

好比:"log.#"能够匹配到“log.info.oa”。“log.*”只会匹配到“log.error”

Fanout(扇型交换机):

  1. 不处理路由键,只须要简单的将队列绑定到交换机上。
  2. 发送到交换机的消息都会被转发到与该交换机绑定的全部队列上
  3. fanout交换机转发消息是最快的。
若是文章对您有帮助,请记得点赞关注哟~ 欢迎你们关注个人公众号:字节传说,每日推送技术文章供你们学习参考。
相关文章
相关标签/搜索