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,分摊信道。
本文来自博客园,作者:Lz_蚂蚱,转载请注明原文链接:https://www.cnblogs.com/leizia/p/17893303.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步