2)RabbitMQ
🌱 第 1 题(基础认知)
Q1:RabbitMQ 是什么?适用于哪些典型场景?
📝 标准答案:
RabbitMQ 是一个基于 AMQP(Advanced Message Queuing Protocol) 的开源消息代理系统,用于实现应用系统之间的异步通信和系统解耦。
核心特点:
- 支持多种协议(AMQP、MQTT、STOMP 等);
- 多种 Exchange 路由策略;
- 保证消息可靠投递;
- 支持消息确认、持久化、死信等机制;
- 插件丰富,支持集群与高可用部署。
常见应用场景:
- 异步处理任务(如发送短信、邮件);
- 削峰填谷(缓解高并发写入压力);
- 系统解耦(微服务通信);
- 顺序任务处理(如订单流程);
- 分布式事件驱动架构(Event-Driven Architecture)。
🌿 第 2 题(核心机制)
Q2:RabbitMQ 中有哪些核心概念?每个的作用是什么?
📝 标准答案:
概念 | 作用 |
---|---|
Producer | 消息生产者,发送消息到 Exchange。 |
Consumer | 消息消费者,从队列(Queue)中接收消息。 |
Queue | 存放消息的容器,消费者从队列消费数据。 |
Exchange | 消息路由器,决定消息发送到哪些队列。 |
Binding | Exchange 与 Queue 的绑定关系,配合路由键实现消息路由。 |
Routing Key | 用于匹配绑定关系的关键词。 |
Virtual Host | 虚拟主机,隔离不同系统的资源。 |
Exchange 类型:
类型 | 说明 |
---|---|
Direct | 精准匹配 routing key。 |
Fanout | 广播,忽略 routing key。 |
Topic | 模糊匹配(如 a.* , a.# ),适合日志系统。 |
Headers | 通过 header 属性匹配,不依赖 routing key。 |
🌳 第 3 题(可靠性与容错)
Q3:RabbitMQ 如何保证消息不丢失?需要配置哪些策略?
📝 标准答案:
✅ 消息持久化策略:
- 持久化 Exchange/Queue: 创建时
durable=true
; - 持久化消息: 发布消息时设置
delivery_mode=2
;
✅ 消息确认机制(Ack/Nack):
- Consumer 确认(手动 ack): 避免消费者宕机导致消息丢失;
- Producer 确认(Confirm 模式):
- 设置
publisher_confirms=true
; - Broker 返回 ack/nack;
- 支持同步、异步回调。
- 设置
✅ 死信队列(DLX):
- 未被消费、消费失败、TTL 过期的消息转入 DLX;
- 避免消息丢失,可做重试或报警。
✅ 集群与镜像队列(Mirrored Queue):
- 配置 Queue 镜像到多个节点(高可用);
- 一节点宕机后自动 failover。
✅ 持久化存储机制:
- RabbitMQ 默认使用 Mnesia 数据库 + disk 写入机制;
- 重启后可恢复持久化消息。
🌲 第 4 题(性能调优)
Q4:RabbitMQ 如何提升性能?有哪些调优建议?
📝 标准答案:
✅ 设计层面优化:
- 消息尽量小(<100KB);
- 减少不必要的持久化(临时消息可用非持久);
- 控制每秒发布/消费消息数,防止积压。
✅ 连接与线程:
- 使用 Connection Pool(如 Spring AMQP 提供);
- 一个连接多个 Channel,提高复用性;
- 合理设置
prefetch
数量,提升并发消费效率。
✅ Consumer 调整:
- 增加消费者线程数;
- 使用并发处理(多线程/协程/异步);
- 消息处理逻辑应尽量快,避免阻塞 ACK。
✅ Broker 参数优化:
- 合理配置内存(如
vm_memory_high_watermark
); - 启用懒队列(Lazy Queue)将冷数据落盘;
- 控制消息 TTL 释放堆积。
✅ 监控与报警:
- 使用 Prometheus + Grafana、RabbitMQ Management 插件实时监控;
- 关注队列长度、未 ACK 消息数量、延迟等指标。
🪵 第 5 题(实际场景)
Q5:请设计一个电商下单系统中的消息异步通知流程(短信/邮件),基于 RabbitMQ 实现,并说明如何保证消息不丢、延迟可控?
📝 标准答案:
场景目标:
- 用户下单成功后,系统通过 RabbitMQ 异步发送短信/邮件;
- 要求高可靠、不重复、不丢失;
- 如果短信系统异常,消息进入重试或告警流程。
✅ 系统流程设计:
订单系统(Producer):
- 下单成功后发送消息到 Exchange(如:
order.notify
); - 消息体包含用户手机号、邮件、订单信息等;
- 设置:
- Exchange 与 Queue 持久化;
- 消息
delivery_mode=2
; - 使用 Confirm 模式确保成功写入 Broker。
- 下单成功后发送消息到 Exchange(如:
Exchange 类型:
direct
类型,根据 routing key 精确路由到短信、邮件队列;- 如:
notify.sms
→sms.queue
,notify.email
→email.queue
。
消费者服务(Consumer):
- 独立部署短信、邮件服务;
- 手动 ACK 模式,确保消费后再确认;
- 消费异常则 NACK + 重回队列或转入死信队列;
- 每个消息处理应具备幂等性机制(避免重复发送)。
死信与告警处理:
- 配置 DLX 队列(
dlx.notify
); - 结合定时任务或人工介入重试;
- 超过最大重试次数则短信报警/钉钉通知开发。
- 配置 DLX 队列(
✅ 设计关键点:
- 保证消息可靠性 → Confirm + 持久化;
- 防止重复处理 → 幂等性 + 手动 ACK;
- 容错机制 → 死信队列 + 重试策略;
- 性能保证 → 消息队列拆分 + 多消费者并发消费。