说下RabbitMQ的整体架构

RabbitMQ 是一个基于 AMQP(Advanced Message Queuing Protocol) 协议的开源消息中间件,RabbitMQ的整体架构围绕消息的生产、路由、存储和消费设计,旨在实现高效、可靠的消息传递,它由多个核心组件协同工作。

核心组件

1. 生产者(Producer)

  • 负责创建并向RabbitMQ服务器发送消息。消息可以包含任意数据(如 JSON、文本、二进制等。生产者不直接将消息发送到队列,而是通过交换机进行消息的路由。

2. 交换机(Exchange)

  • 接收生产者发送的消息,并根据路由规则 将消息转发到一个或多个队列。交换机不存储消息 ,如果没有匹配的队列,消息可能会被丢弃(取决于具体配置)。交换机的类型决定路由行为
  • 类型
    • Direct Exchange精确匹配,根据消息的路由键(routing key)进行匹配。如果路由键与绑定队列时指定的键完全匹配,消息就会被发送到该队列。比如在一个物流系统中,根据订单的配送地区作为路由键,将订单消息发送到对应地区的处理队列。
    • Topic Exchange :支持通配符匹配 的路由规则。使用 * 匹配一个单词,# 匹配零个或多个单词。比如在日志监控系统中,以系统名称(如 order.*user.#)作为路由规则,将不同的日志消息发送到相应的队列。
    • Fanout Exchange :将接收到的消息广播到所有与它绑定的队列,不考虑路由键。适用于广播消息的场景,如系统通知,所有订阅通知的队列都会收到消息。
    • Headers Exchange :根据消息的headers属性进行匹配,而不是路由键。这种类型相对较少使用。

3. 队列(Queue)

  • 存储消息的地方,消费者从队列中获取消息进行处理。队列是RabbitMQ中消息存储的基本单元,多个消费者可以从同一个队列中竞争获取消息。队列需与交换机通过 Binding Key 绑定,才能接收消息。
  • 队列可以设置持久化(服务器重启后队列依然存在)、排他性(仅创建它的连接可见且使用,连接关闭队列自动删除)、自动删除(当所有消费者断开连接后,队列自动删除)等属性。

4. 消费者(Consumer)

  • 从RabbitMQ服务器的队列中获取消息并进行处理。消费者可以订阅一个或多个队列,当队列中有新消息时,消费者会收到并处理。
  • 可以进行手动确认(ACK)或拒绝(NACK)消息,确保可靠性。

5. 消息代理(Broker)

  • 即RabbitMQ服务器本身,它负责接收生产者发送的消息根据交换机和绑定规则进行消息路由,并为消费者提供消息 。Broker管理着交换机、队列、绑定等各种资源,并保证消息的可靠传递。
    • 集群模式:为了提高可靠性和性能,RabbitMQ可以组成集群。集群中的节点可以共享队列、交换机等资源,当某个节点出现故障时,其他节点可以继续提供服务。
    • 镜像队列:是一种特殊的队列集群方式,队列会在多个节点上进行镜像备份,确保即使某个节点故障,消息仍然可用。

辅助组件

1. 绑定(Binding)

  • 建立交换机和队列之间的关联关系。通过绑定,交换机知道应该将哪些消息发送到哪个队列。绑定可以指定一个路由键(在Direct和Topic交换机中),用于更精确的消息路由。

2. 连接与信道(Connection & Channel)

  • Connection:生产者/消费者与 Broker 之间的 TCP 连接。
  • Channel:复用连接中的逻辑通道,避免频繁创建 TCP 连接的开销。

3. 虚拟主机(Virtual Host)

  • Virtual Host 是 RabbitMQ 中的一个逻辑概念,类似于数据库中的"数据库实例"。每个虚拟主机都有自己独立的交换机、队列、绑定等资源,它们之间相互隔离 。虚拟主机为多租户环境提供了支持,不同的应用或用户可以在各自的虚拟主机中进行消息传递,互不干扰。
  • 比如云服务提供商,可以为每个租户分配一个独立的虚拟主机,每个租户在自己的虚拟主机内管理自己的消息队列系统,不用担心与其他租户的资源冲突。

架构特点

  1. 解耦生产与消费
    • 生产者无需知道消费者的存在,通过交换机和队列实现松耦合。
  2. 灵活的路由机制
    • 通过交换机类型和绑定规则支持多种消息分发模式(点对点、发布订阅等)。
  3. 可靠性保证
    • 支持消息持久化、手动确认(ACK)、死信队列(Dead Letter Queue)等机制。
  4. 扩展性
    • 支持集群部署、镜像队列(高可用)、负载均衡。
相关推荐
子兮曰26 分钟前
后端字段又改了?我撸了一个 BFF 数据适配器,从此再也不怕接口“屎山”!
前端·javascript·架构
卓卓不是桌桌3 小时前
如何优雅地处理 iframe 跨域通信?这是我的开源方案
javascript·架构
Qlly3 小时前
DDD 架构为什么适合 MCP Server 开发?
人工智能·后端·架构
用户881586910911 天前
AI Agent 协作系统架构设计与实践
架构
鹏北海1 天前
Qiankun 微前端实战踩坑历程
前端·架构
货拉拉技术1 天前
货拉拉海豚平台-大模型推理加速工程化实践
人工智能·后端·架构
茶杯梦轩1 天前
从零起步学习RabbitMQ || 第三章:RabbitMQ的生产者、Broker、消费者如何保证消息不丢失(可靠性)详解
分布式·后端·面试
RoyLin1 天前
libkrun 深度解析:架构设计、模块实现与 Windows WHPX 后端
架构
CoovallyAIHub2 天前
实时视觉AI智能体框架来了!Vision Agents 狂揽7K Star,延迟低至30ms,YOLO+Gemini实时联动!
算法·架构·github
RoyLin2 天前
领域驱动设计:回归本质的工程实践
架构