Skip to content

P91 简述 RabbitMQ 的架构设计 ​

面试题:RabbitMQ 的整体架构是什么?消息从生产到消费经历了什么?

1. 核心角色 ​

text
Producer(生产者)
 → Exchange(交换机)
 → Binding(绑定关系)
 → Queue(队列)
 → Consumer(消费者)
  • Broker:RabbitMQ 服务节点;
  • Exchange:路由消息到队列(不存消息);
  • Queue:存储消息,消费端从队列取;
  • Virtual Host(vhost):逻辑隔离空间(权限、队列隔离);
  • Channel:连接内的逻辑通道(一个 TCP 连接多个 channel,减少连接开销)。

2. 消息流转 ​

text
① 生产者把消息发给 Exchange(指定 routing key)
② Exchange 按类型 + 绑定规则路由到队列
③ 消息存储在 Queue(可持久化)
④ 消费者连接 Queue 消费

3. 四种交换机类型 ​

类型路由规则
Directrouting key 完全匹配
Topicrouting key 通配符匹配(* 一个词,# 任意多个)
Fanout广播到所有绑定的队列(忽略 routing key)
Headers按消息头匹配(不常用)

4. 高可用(镜像/仲裁队列) ​

  • 普通集群:队列只在单节点,其他节点只做路由;
  • 镜像队列(Classic):主从复制,主挂自动切换;
  • 仲裁队列(Quorum,3.8+):Raft 协议复制,推荐;
  • 配合 Lazy Queue(懒队列,消息落盘)处理大量积压。

5. 加分点 ​

  • 提到 Confirm(发布确认)+ Mandatory + Return 机制保证生产端不丢消息;
  • 提到消费端 ACK + 预取(prefetch) 控制消费速率;
  • 追问"为什么有 Exchange 而不直接发队列":解耦,路由灵活(广播/通配/精确);
  • 提到 TTL、死信队列(DLX)用于延迟消息/异常消息处理。

一句话总结 ​

RabbitMQ 架构 = Producer → Exchange(Direct/Topic/Fanout) → Binding → Queue → Consumer,vhost 做租户隔离、Channel 复用连接;高可用靠镜像/仲裁队列,可靠性靠生产端 Confirm + 消费端 ACK。

基于 VitePress 重建