核心概念
RabbitMQ 是基于 AMQP(Advanced Message Queuing Protocol)协议实现的消息中间件,采用 生产者-交换器-队列-消费者 的架构模型,通过解耦组件实现异步通信和削峰填谷。
架构组件详解
1. 核心组件
Producer → Exchange → Binding → Queue → Consumer
↓
Virtual Host (隔离)
↓
Connection → Channel (多路复用)
关键组件说明:
- Producer(生产者):发送消息的应用程序
- Exchange(交换器):接收消息并根据路由规则分发到队列
- Queue(队列):存储消息,等待消费者消费
- Binding(绑定):Exchange 和 Queue 之间的路由规则
- Consumer(消费者):接收并处理消息的应用程序
- Virtual Host(虚拟主机):逻辑隔离单元,相当于命名空间
- Connection(连接):TCP 长连接
- Channel(信道):在 Connection 内的虚拟连接,复用 TCP 连接
2. 消息流转过程
// 1. 生产者发送消息到 Exchange
channel.basicPublish(
"exchange_name", // 交换器名称
"routing_key", // 路由键
MessageProperties.PERSISTENT_TEXT_PLAIN,
message.getBytes()
);
// 2. Exchange 根据类型和路由键决定分发到哪个队列
// 3. Queue 存储消息
// 4. Consumer 从队列拉取或推送消息
channel.basicConsume(queueName, autoAck, consumer);
3. Broker 内部结构
RabbitMQ Broker
├── Virtual Host (/)
│ ├── Exchange (交换器)
│ │ ├── direct
│ │ ├── fanout
│ │ ├── topic
│ │ └── headers
│ ├── Queue (队列)
│ │ ├── 消息存储
│ │ └── 消费者绑定
│ └── Binding (绑定关系)
└── 权限控制
关键原理
1. Channel 多路复用
- 每个 Connection 是一个 TCP 连接(开销大)
- 多个 Channel 共享一个 Connection(轻量级)
- 线程隔离:每个线程使用独立的 Channel
Connection connection = factory.newConnection();
Channel channel = connection.createChannel(); // 创建信道
2. Virtual Host 隔离
- 不同业务使用不同的 vhost
- 相互隔离的 Exchange、Queue、Binding
- 独立的权限控制
3. 消息确认机制
- 生产者确认:Confirm 模式确保消息到达 Exchange
- 消费者确认:ACK 机制确保消息被正确处理
- 持久化:Exchange、Queue、Message 可设置持久化
性能与高可用考量
1. 性能优化
- 批量发送:减少网络开销
- 异步发送:使用 Confirm 异步模式
- 预取数量:
channel.basicQos(prefetchCount)控制消费速率 - 惰性队列:消息直接存盘,降低内存压力
2. 高可用方案
普通集群(元数据共享)
├── 队列数据在单节点
└── 消费时可能需要转发
镜像队列(主从同步)
├── 队列数据在多节点
└── 自动故障转移
仲裁队列(Quorum Queue,推荐)
├── 基于 Raft 协议
└── 更强的一致性保证
3. 集群架构
Load Balancer
↓
RabbitMQ Cluster
├── Node1 (Master)
├── Node2 (Mirror)
└── Node3 (Mirror)
面试总结
核心架构:Producer → Exchange → Queue → Consumer,通过 Channel 多路复用 TCP 连接,Virtual Host 实现逻辑隔离。
关键特性:
- Exchange 支持多种路由模式(direct/fanout/topic/headers)
- 双重确认机制(生产者 Confirm + 消费者 ACK)
- 支持集群和镜像队列实现高可用
应用场景:
- 异步解耦(订单系统与库存系统)
- 流量削峰(秒杀场景)
- 延迟队列(定时任务)
- RPC 调用(通过 replyTo 实现)
常见问题:
- 消息丢失 → 开启持久化 + 确认机制
- 消息重复 → 消费端幂等性处理
- 消息堆积 → 增加消费者 + 调整预取数量