MST

星途 面试题库

面试题:消息队列之RocketMQ在集群环境下高可用的关键技术点

在RocketMQ的集群部署场景中,NameServer、Broker等组件各自在保证高可用性方面起到什么作用?当某个Broker节点出现故障时,RocketMQ是如何快速恢复并确保消息不丢失且系统持续可用的?
18.0万 热度难度
后端开发消息队列

知识考点

AI 面试

面试题答案

一键面试

NameServer在高可用性方面的作用

  1. 无状态设计:NameServer本身是无状态的,这使得它非常易于水平扩展。多个NameServer实例之间相互独立,不存在数据同步等复杂问题,通过增加NameServer实例就可以提升整体的可用性和负载能力。
  2. 提供路由信息:NameServer存储了整个RocketMQ集群的路由信息,包括Broker、Topic等元数据。Broker在启动时会向所有存活的NameServer注册自己的信息,Producer和Consumer通过NameServer获取到这些路由信息,从而能够与对应的Broker进行通信。如果某个NameServer实例出现故障,其他NameServer实例仍然可以提供完整的路由信息,保证系统的正常运行。

Broker在高可用性方面的作用

  1. 主从架构:Broker采用主从架构部署,主Broker负责处理读写请求,从Broker通过同步主Broker的数据来实现数据冗余。当主Broker出现故障时,从Broker可以接管其工作,保证消息服务的连续性。
  2. 数据同步:主从Broker之间通过同步机制来保证数据一致性。有同步复制和异步复制两种方式。同步复制方式下,主Broker在收到消息后,会等待至少一个从Broker同步成功后才返回成功响应,这种方式可以最大程度保证消息不丢失,但会略微影响性能;异步复制方式下,主Broker在收到消息后立即返回成功响应,然后异步将消息同步给从Broker,这种方式性能较高,但在主Broker故障时可能会丢失少量未同步的消息。

Broker节点故障时的恢复机制及确保消息不丢失和系统持续可用的方式

  1. 故障检测:NameServer会定期检测Broker的心跳,如果某个Broker在一定时间内没有发送心跳,NameServer会判定该Broker节点故障,并将其从路由信息中剔除。
  2. 主从切换:当主Broker出现故障时,从Broker会被选举为新的主Broker继续提供服务。选举过程通常基于一定的算法,例如根据从Broker的数据同步状态、性能等因素来确定新的主节点。
  3. 消息恢复:对于采用同步复制方式的集群,由于消息在主Broker写入成功时已经同步到至少一个从Broker,所以在主从切换后消息不会丢失。对于异步复制方式的集群,虽然可能存在少量未同步的消息,但RocketMQ提供了消息补偿机制。当新的主Broker启动后,它会尝试从故障的主Broker中恢复未同步的消息,或者等待Producer的重试机制重新发送未确认的消息,从而确保消息不丢失。
  4. Producer和Consumer调整:Producer和Consumer在发现Broker节点故障后,会从NameServer获取最新的路由信息,从而调整与新的Broker节点进行通信,保证系统持续可用。