RocketMQ 有几种集群部署方式?

一则或许对你有用的小广告

欢迎 加入小哈的星球 ,你将获得: 专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新开坑项目: 《Spring AI 项目实战(问答机器人、RAG 增强检索、联网搜索)》 正在持续爆肝中,基于 Spring AI + Spring Boot3.x + JDK 21...点击查看;
  • 《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot3.x + JDK 17...点击查看项目介绍; 演示链接: http://116.62.199.48:7070/;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/

面试考察点

  1. 架构设计能力:面试官不仅仅是想知道有几种部署方式,更是想考察你是否理解不同部署模式在可靠性、吞吐量、延迟之间的权衡,能否根据业务 SLA 要求做出合理选型。

  2. 高可用理解深度:同步复制和异步复制的区别是什么?Master 宕机后 Slave 如何接管?Dledger 自动选主原理是什么?这些问题直指你对 RocketMQ 高可用机制的底层理解。

  3. 生产实践意识:能否说出你们生产环境的部署模式?为什么这么选?踩过什么坑?这考察的是真实项目经验,而非纸上谈兵。

核心答案

RocketMQ 主要有 5 种集群部署方式:

部署模式可靠性吞吐量Master 宕机影响推荐场景
单 Master❌ 极低整体不可用仅本地测试
多 Master⚠️ 中等最高仅影响该 Broker 上的 Topic允许丢消息的日志场景
多 Master 多 Slave(异步复制)✅ 较高Slave 自动接管消费,短暂不可写入通用业务场景
多 Master 多 Slave(同步双写)✅✅ 极高较低(同步开销)Slave 无缝接管,消息零丢失金融、交易等核心链路
Dledger / Controller 模式✅✅ 极高较高自动选主,秒级切换追求自动故障恢复的生产环境

一句话总结:生产环境最常用的是 多 Master 多 Slave 同步双写模式,配合 Dledger 或 RocketMQ 5.0 的 Controller 模式实现自动故障切换。

深度解析

一、模式一:单 Master

上图展示了单 Master 模式的架构,特点非常简单:

  • 架构:只有一个 Broker 节点,所有消息都写入这个节点。
  • 优点:部署最简单,配置最少,适合快速验证功能。
  • 致命缺点单点故障。Broker 一旦宕机,整个消息系统不可用,所有未消费的消息都无法恢复。
  • 适用场景:仅限本地开发测试,绝对不能用于生产环境

二、模式二:多 Master

上图展示了多 Master 模式的架构:

  • 架构:多个 Broker 节点都是 Master,没有 Slave。Topic 的 Queue 分布在不同 Master 上,Producer 轮询发送实现负载均衡。
  • 优点
    • 吞吐量最高——没有同步复制的开销,所有 Master 独立写入
    • 单个 Master 宕机不影响其他 Master 上的消息收发
    • 部署运维相对简单
  • 缺点
    • 宕机的 Master 上的 Queue 不可用,该部分消息无法投递和消费
    • 没有数据副本,Master 磁盘故障会导致消息永久丢失
    • 宕机恢复后需要手动重启,没有自动故障切换
  • 适用场景:日志采集、监控数据上报等允许少量丢消息、对可用性要求不极端的场景。

三、模式三:多 Master 多 Slave——异步复制

上图展示了异步复制模式的工作机制:

  • 写入流程:Producer 发消息到 Master,Master 写入 CommitLog立即返回 ACK,不等 Slave 确认。Slave 通过后台线程异步从 Master 拉取数据。
  • 优点
    • 写入延迟低(不需要等 Slave 确认),吞吐量接近纯多 Master 模式
    • Master 宕机后 Slave 有绝大部分数据,可以接管消费
  • 缺点
    • 存在短暂的数据窗口:Master 写入成功但尚未复制到 Slave 的消息,如果此时 Master 宕机,这部分消息会丢失
    • 实际丢失概率很低,但在金融场景下不可接受
  • 适用场景:大部分通用业务场景(订单通知、异步任务等),在性能和可靠性之间取得平衡

四、模式四:多 Master 多 Slave——同步双写

上图展示了同步双写模式的工作机制:

  • 写入流程:Producer 发消息到 Master,Master 写入 CommitLog 后,同步等待 Slave 也写入成功,两者都确认后才返回 ACK 给 Producer。
  • 优点
    • 消息零丢失:只要 Producer 收到 ACK,就意味着 Master 和 Slave 都已持久化
    • Master 宕机后 Slave 持有全量数据,可以无缝接管
  • 缺点
    • 写入延迟增加——每次写入多了一次网络往返(Master → Slave → Master)
    • 吞吐量下降约 20%~30%(取决于网络质量)
    • Slave 写入失败会阻塞 Master 的响应
  • 适用场景:金融交易、支付订单等绝对不能丢消息的核心业务链路。

五、模式五:Dledger / Controller 自动故障切换

上图展示了 Dledger 模式的核心机制:

  • 架构:一组 Broker(通常 3 个节点)通过 Raft 共识协议管理,自动选主、自动复制。
  • 工作机制
    • 正常运行时,一个节点是 Leader(等同于 Master),其余是 Follower(等同于 Slave)
    • 所有写请求经过 Leader,Leader 通过 Raft 协议同步到 Follower
    • Leader 宕机后,Follower 自动发起选举,获得多数派投票后晋升为新 Leader
    • 新 Leader 自动向 NameServer 注册,客户端自动感知切换
  • RocketMQ 5.0 的 Controller 模式:5.0 版本引入了内置 Controller 组件,不再依赖 Dledger 外部组件,直接在 Broker 内部实现自动故障切换,部署更简单。
对比维度Dledger(4.x)Controller(5.0+)
选主协议Raft内置 Controller + Raft
部署方式需要额外部署 DledgerBroker 内嵌,无需额外组件
切换速度10~30 秒10~30 秒
运维复杂度较高
推荐度✅ 4.x 版本推荐5.0+ 版本首选

六、五种模式全面对比

七、生产环境部署建议

上图展示了生产环境的推荐部署架构:

  • NameServer:至少部署 2 个节点(推荐 3 个),分布在不同物理机上。各节点独立运行,互不影响。
  • Broker:采用 多 Master 多 Slave 同步双写模式,每个 Master 配一个 Slave,Master 和 Slave 必须部署在不同的物理机上。
  • Controller(5.0+):启用内置 Controller,实现 Master 宕机后 Slave 自动晋升,秒级故障切换。
  • 系统优化:同步刷盘、关闭 swap、使用 XFS 文件系统、JVM 堆内存建议 8G。

面试高频追问

  1. 追问一:同步双写和异步复制,性能差多少?

    • 同步双写的吞吐量通常比异步复制低 20%~30%,写入延迟增加一次网络往返(约 0.5~2ms,取决于内网质量)。但换来的是消息零丢失,在金融场景下是值得的。
  2. 追问二:Master 宕机后,Slave 怎么接管?

    • 传统模式:Slave 只能接管消费(只读),不能写入。需要人工干预将 Slave 提升为 Master。Dledger/Controller 模式:通过 Raft 协议自动选举新 Leader,10~30 秒内完成切换,新 Leader 同时支持读写。
  3. 追问三:你们生产环境是怎么部署的?

    • 建议回答:"我们采用的是多 Master 多 Slave 同步双写模式,2 组 Broker(共 4 台),3 台 NameServer。开启了 RocketMQ 5.0 的 Controller 模式做自动故障切换,同步刷盘保证消息不丢失。"
  4. 追问四:异步复制一定会丢消息吗?

    • 不一定。异步复制存在一个很短的数据窗口(通常在毫秒级),只有在这个窗口内 Master 宕机才会丢消息。实际丢失概率很低,但不是零。对绝大多数业务来说够用,但金融场景不行。

常见面试变体

  • 变体一:"RocketMQ 的主从复制有几种方式?有什么区别?"
  • 变体二:"RocketMQ 怎么保证高可用?"
  • 变体三:"同步双写和异步复制怎么选?"
  • 变体四:"RocketMQ 的 Dledger 是什么?解决了什么问题?"

记忆口诀

五种模式:单主(测试)、多主(高性能)、异步复制(性价比)、同步双写(零丢失)、Dledger(全自动)。

选型口诀:要省钱多 Master,要可靠同步写,要自动 Dledger。

复制策略:异步快但可能丢,同步慢但绝对稳。

总结

RocketMQ 集群部署方式从简单到复杂依次为:单 Master → 多 Master → 异步复制 → 同步双写 → Dledger/Controller。生产环境推荐 多 Master 多 Slave 同步双写 + Controller 自动故障切换,在消息可靠性和系统可用性之间取得最佳平衡。面试时重点讲清楚同步双写和异步复制的区别,以及 Dledger/Controller 的自动选主机制,展现你对高可用架构的深入理解。