当 Broker 的 Master 节点宕机且未配置自动切换时,Consumer 还可以继续消费吗?
在 RocketMQ 中,当 Broker 的 Master 节点宕机且未配置自动切换(即普通的 Master-Slave 部署架构,未使用 Dledger 或 Controller 模式)时,Consumer(消费者)是可以继续消费的。
但是,这种消费有一定的条件和局限性。以下是具体的原理解析和影响:
1. 为什么可以继续消费?(原理)
RocketMQ 原生支持主备读写分离/故障转移机制:
- 平时状态:Consumer 默认从 Master 节点拉取消息。如果 Master 发现 Consumer 的消费进度落后较多(冷数据读),Master 会在返回拉取结果时,建议 Consumer 下一次从 Slave 节点拉取,以减轻 Master 的压力。
- Master 宕机状态:当 Master 宕机后,NameServer 会在经过一定时间(最多约 120 秒)后剔除 Master 的路由信息。Consumer 在定时更新路由表后,发现该 Broker 组下只有 Slave 节点(
brokerId > 0),此时 Consumer 会自动切换到从 Slave 节点拉取消息。
2. 继续消费的前提条件与限制
虽然可以消费,但此时系统的状态是“降级”的,需注意以下几点:
A. 只能消费“存量消息”,无法接收“新增消息”
- 因为没有自动切换机制,Master 宕机后,该 Broker 组失去了写入能力。
- Producer 无法再将新消息发送到这个 Broker 组(如果是集群模式,Producer 会自动将新消息路由到其他存活的 Master 节点)。
- 因此,Consumer 此时从 Slave 节点消费的,仅仅是 Master 宕机前已经同步到 Slave 的历史存量消息。
B. 可能会有少量消息丢失或重复消费(取决于主从同步模式)
- 异步复制(ASYNC_MASTER):如果 Master 宕机前,有少量最新消息还没来得及同步给 Slave,那么 Consumer 此时在 Slave 上是拉取不到这些消息的。等 Master 恢复后,这部分消息才能被消费。
- 同步双写(SYNC_MASTER):消息在 Master 和 Slave 都写成功后才会向 Producer 返回成功,因此 Consumer 可以从 Slave 完整消费到所有已确认发送成功的消息。
C. 短暂的消费延迟(感知时间窗口)
Master 宕机并不是瞬间被 Consumer 感知到的,中间会有一个短暂的“不可用窗口期”:
- Master 宕机。
- Consumer 尝试向 Master 拉取消息,发生网络超时或连接拒绝。
- NameServer 等待心跳超时(默认最高 120s)后剔除 Master。
- Consumer 定时(默认 30s)从 NameServer 更新路由信息。
- Consumer 获取到 Slave 的地址,开始从 Slave 消费。
(在这个时间差内,部分拉取请求会失败并重试)。
总结
结论:在未配置自动切换的情况下,Master 宕机后,Consumer 可以自动降级从 Slave 节点继续消费存量数据,保证了消费端的高可用。
影响:该 Broker 组完全丧失写入能力(无法提供高可用写)。如果业务要求严格的 7x24 小时读写高可用,建议在较新版本的 RocketMQ 中启用 Controller 模式(自动主从切换) 或 DLedger 模式。