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. 四种交换机类型
| 类型 | 路由规则 |
|---|---|
| Direct | routing key 完全匹配 |
| Topic | routing 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。