一、核心架构组件
1. 生产者
生产者是发送消息的客户端应用程序。它创建一个消息,并将其发布(推送)到 RabbitMQ 服务器上的一个交换机。
2. 消费者
消费者是接收消息的客户端应用程序。它连接到 RabbitMQ 服务器,并订阅一个队列,以便从该队列中获取(拉取)消息进行处理。
3. 消息
消息就是传递的数据。它包含两部分:
有效载荷: 要传输的实际数据,可以是任何格式(如 JSON、XML、二进制数据等)。
标签: 元信息,如路由键、头信息、是否持久化等。这些属性决定了 RabbitMQ 如何处理消息。
4. 信道
信道是建立在 TCP 连接之上的虚拟连接。在一个应用程序中,与 RabbitMQ 建立多个 TCP 连接是非常消耗资源的。信道使得在单个 TCP 连接上可以创建多个独立的、轻量级的“数据通道”,每个信道进行自己的通信,从而复用连接,提高效率。
可以把 TCP 连接想象成一条高速公路,而信道就是这条高速上的多条并行车道。
5. 交换机
交换机是消息的路由中心,是 RabbitMQ 架构中最核心的部分。生产者将消息发送到交换机,而不是直接发送到队列。交换机负责根据特定的规则(绑定和路由键)将消息分发到一个或多个队列中。如果消息没有路由到任何队列,它会被丢弃或返回给生产者。
RabbitMQ 提供了几种不同类型的交换机,决定了不同的路由行为。
6. 队列
队列是一个用于存储消息的缓冲区。它本质上是一个先进先出的数据结构。多个消费者可以订阅同一个队列,但一条消息只会被其中一个消费者获取(竞争消费者模式)。队列是消息的最终目的地,消费者从这里获取消息。
7. 绑定
绑定是交换机和队列之间的连接规则。你可以理解为:“告诉交换机,请把符合某种条件的消息,发送到某个队列”。这个“条件”就是由绑定键 来定义的。
二、消息流工作流程(核心架构图)
一个典型的消息流如下所示:

连接与信道: 生产者和消费者首先与 RabbitMQ Broker 建立一个 TCP 连接,然后在该连接上创建一个信道用于通信。
声明交换机与队列: 应用程序通常会先声明(创建或确保存在)一个交换机和若干个队列。
创建绑定: 应用程序将队列与交换机通过绑定键 绑定起来。
发布消息: 生产者将消息发布到指定的交换机,并提供一个路由键。
路由消息: 交换机接收到消息,根据自身的类型和绑定规则,将消息的路由键与队列的绑定键进行匹配。
如果匹配成功,消息会被放入对应的队列。
如果无法匹配任何队列,消息会被丢弃或返回给生产者(取决于消息的 mandatory 参数)。
存储消息: 消息在对应的队列中等待被消费。
获取消息: 消费者从订阅的队列中获取消息(可以是推送模式或拉取模式)。
确认消息: 消费者处理完消息后,会向 RabbitMQ 发送一个确认信号,告知消息已被成功处理。RabbitMQ 随后从队列中删除该消息。如果消费者没有确认就断开连接,RabbitMQ 会认为该消息处理失败,并将其重新投递给另一个消费者。
三、交换机类型与路由模式
交换机的类型决定了消息路由的规则,这是 RabbitMQ 灵活性的关键。
四、高级特性和架构扩展
1. 虚拟主机
虚拟主机提供了逻辑上的隔离,可以将一个 RabbitMQ 服务器分割成多个独立的“消息域”。每个 vHost 都有自己的交换机、队列、绑定和权限。对于多租户系统非常有用。
2. 集群与高可用
为了满足高并发和高可用的需求,RabbitMQ 支持集群模式。
集群: 将多个 RabbitMQ 节点组成一个逻辑上的 Broker,共享队列和交换机的元数据(定义)。默认情况下,队列本身只存在于创建它的那个节点上,但其他节点可以透明地访问它。
镜像队列: 为了解决队列单点故障问题,可以设置队列为镜像队列。它会将队列的内容(消息)复制到集群中的其他节点上,形成一个主从结构。如果主节点失效,从节点会自动提升为主节点,确保服务不中断。
3. 插件生态系统
RabbitMQ 拥有丰富的插件生态系统,可以扩展其功能,例如:
MQTT 插件: 使其支持 IoT 场景的 MQTT 协议。
STOMP 插件: 支持 STOMP 协议。
管理插件: 提供 Web 管理界面,方便监控和管理。
Shovel 插件: 用于在 Broker 之间可靠地移动消息。
Federation 插件: 用于在 Broker 之间 federation 交换机和队列,适用于跨 WAN 的场景。