保护私人版权,尊重他人版权。转载请注明出处并附带页面链接
MQ(Message Queue,消息队列)是一种应用系统之间的通信方法。是通过读写出入队列的消息来通信的。
AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写。
为什么使用RabbitMQ
- RabbitMQ是唯一一个实现了AMQP标准的消息服务器
- 可靠性,RabbitMQ的持久化支持,保证了消息的稳定性;
- 高并发,RabbitMQ使用了Erlang开发语言,Erlang是为电话交换机开发的语言,天生自带高并发光环,和高可用特性;
- 集群部署简单,正是应为Erlang使得RabbitMQ集群部署变的超级简单;
- 社区活跃度高;
- 可视化的管理界面;
RabbitMQ核心概念
Channel 信道
消息推送使用的通道,是生产消费者与rabbit通信的渠道。信道是建立在TCP连接上的虚拟连接,就是说rabbitmq在一条TCP上建立成百上千个信道来达到多个线程处理,这个TCP被多个线程共享,每个线程对应一个信道,信道在rabbit都有唯一的ID ,保证了信道私有性,对应上唯一的线程使用。
Exchange 交换机
Exchange的作用类似于路由器,routing key 就是路由键,服务器会根据路由键将消息从交换器路由到队列上去。用于接收消息,转发消息到绑定的队列上,指定消息按什么规则,路由到哪个队列。
- direct:如果路由器routing Key完全匹配,消息就被投递到相应的队列。可以理解为1:1。
- fanout:如果交换器接收到消息,不用管Routing Key。将会广播到所有绑定的队列上(所有队列都会绑定到一个exchange上),可以理解为1:n。
- topic:多个交换器可以路由消息到同一个队列。根据模糊匹配,比如一个队列的routing key 为*.test ,那么凡是到达交换器的消息中的routing key 后缀.test都被路由到这个队列上。 可以理解为n:1。
Queue队列
用于存储消息,RabbitMQ中的消息都只能存储在Queue中,生产者(下图中的P)生产消息并最终投递到Queue中,消费者(下图中的C)可以从Queue中获取消息并消费。
工作原理
应用程序和RabbitMQ Server之间会创建一个TCP连接,一旦TCP打开,并通过了认证,应用程序和Rabbit就创建了一条AMQP信道(Channel)。
信道是创建在“真实”TCP上的虚拟连接,AMQP命令都是通过信道发送出去的,每个信道都会有一个唯一的ID,不论是发布消息,订阅队列或者介绍消息都是通过信道完成的。
延伸:为什么不直接通过TCP发送命令?
消息如何发送给MQ
生产者把消息发布到 Exchange 上,消息最终到达队列并被消费者接收,而 Binding 决定交换机的消息应该发送到那个队列。
- 消息发布到交换器时,消息将拥有一个路由键(routing key),在消息创建时设定。
- 通过队列路由键,可以把队列绑定到交换器上。
- 消息到达交换器后,RabbitMQ会将消息的路由键与队列的路由键进行匹配(针对不同的交换器有不同的路由规则)。如果能够匹配到队列,则消息会投递到相应队列中;
工作模式
简单模式和工作队列模式
由3个对象组成,消息生成者P、队列、消费者C。一条消息只能给一个消费者消费。
案例:发送短信、执行一次性任务。
发布/订阅模式
- 每个消费者监听自己的队列;
- 由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到消息;
- 使用fanout的模式。不处理路由键。只需要简单的将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。
案例:发送多种通知,当用户充值成功后,需要发送多种通知,比如短信、邮件。
路由模式
每个消费者监听自己的队列,并且设置routingkey。
生产者将消息发给交换机,由交换机根据routingkey来转发消息到指定的队列。一个消息可以被多个消费者获取,并且消息的目标队列可被生产者指定。
使用direct模式。处理路由键。需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。
话题模式
- 每个消费者监听自己的队列,并且设置带统配符的routing key。
- 由交换机根据routing key来转发消息到指定的队列。
- 使用topic模式。将路由键和某模式进行匹配。符号 “#” 匹配一个或多个词,符号“*”匹配一个词。
总结:
- 简单模式和工作模式只能发布到一个队列被一个消费者使用,exchange为空;
- 发布订阅模式可以指定交换机,与改交换机绑定的队列都会收到消息,消息可以被多个消费者使用。
- 路由模式比发布订阅模式多了可以指定routing key。
- 话题模式与路由模式的区别是,可以模糊匹配routing key。