RabbitMQ基本原理

大佬文章,请优先查看!!!

RabbitMQ基本原理


RabbitMQ遵循的是AMQP协议(Advanced Message Queuing Protocol - 高级消息队列协议)

生产者发送消息的流程

消息生产者连接到RabbitMQ Broker,建立TCP链接(Connection),在链接(Connection)上开启一个信道(Channel)
生产者声明一个交换机(Exchange),并设置相关属性,比如交换机类型、是否持久化等
生产者声明一个队列(Queue),并设置相关属性,比如是否排他、是否持久化、是否自动删除等
生产者通过路由键(RoutingKey)将队列(Queue)和交换机(Exchange)绑定起来
生产者发送消息至 RabbitMQ Broker,其中包含routingKey (路由键)、交换器等信息,根据路由键(RoutingKey)发送消息到交换机(Exchange)
相应的交换机(Exchange)根据接收到的路由键(RoutingKey)查找相匹配的队列,如果找到则将从生产者发送过来的消息存入相应的队列中
如果没有找到,则根据生产者配置的属性选择丢弃还是回退给生产者
关闭信道(Channel)
关闭链接(Connection)

消费者接收消息的过程

消费者建立链接(Connection)到RabbitMQ Broker
在链接(Connection)上开启一个信道(Channel)
消费者向RabbitMQ Broker请求消费指定队列(Queue)的消息,并设置回调函数(onMessage)
[MQ]将消息推送给消费者,消费者接收消息
消费者发送消息确定(Ack[acknowledge])接收到的消息
RabbitMQ从队列中删除相应己经被确认的消息
关闭信道(Channel)
关闭链接(Connection)

MQ消费消息分发原理

1)一种是Pull模式,对应的方法是basicGet。
消息存放在服务端,只有消费者主动获取才能拿到消息。如果每搁一段时间获取一次消息,消息的实时性会降低。
但是好处是可以根据自己的消费能力决定消息的频率。
2)另一种是push,对应的方法是BasicConsume,只要生产者发消息到服务器,就马上推送给消费者,
消息保存客户端,实时性很高,如果消费不过来有可能会造成消息积压。Spring AMQP是push方式,
通过事件机制对队列进行监听,只要有消息到达队列,就会触发消费消息的方法。

Connection和Channel关系

生产者和消费者,需要与RabbitMQ Broker建立TCP连接,也就是Connection。一旦TCP连接建立起来,客户端紧接着创建一个AMQP 信道(Channel),每个信道都会被指派一个唯一的ID。信道是建立在Connection之上的虚拟连接,RabbitMQ处理的每条AMQP指令都是通过信道完成的。

为什么不直接使用TCP连接,而是使用信道?

RabbitMQ采用类似NIO的做法,复用TCP连接,减少性能开销,便于管理。

当每个信道的流量不是很大时,复用单一的Connection可以在产生性能瓶颈的情况下有效地节省TCP连接资源。

当信道本身的流量很大时,一个Connection就会产生性能瓶颈,流量被限制。需要建立多个Connection,分摊信道。

posted @   Lz_蚂蚱  阅读(35)  评论(0编辑  收藏  举报
(评论功能已被禁用)
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起