面试题答案
一键面试RocketMQ保障高可用性的机制
- NameServer 高可用:NameServer 本身是无状态的,多个 NameServer 实例之间相互独立,不进行数据同步。Broker 在启动时会向所有配置的 NameServer 实例注册自己的元数据信息。Producer 和 Consumer 在启动时也会向所有配置的 NameServer 拉取元数据。即使部分 NameServer 实例出现故障,其他 NameServer 实例依然可以提供服务,保证 Broker 元数据的查询和注册功能不受影响。
- Broker 高可用:
- Master - Slave 架构:Broker 采用 Master - Slave 架构,一个 Master 可以对应多个 Slave。Master 负责处理读写请求,Slave 从 Master 同步数据。当 Master 出现故障时,Slave 可以切换为 Master 继续提供服务。
- 数据同步机制:RocketMQ 支持同步双写和异步复制两种数据同步方式。同步双写是指 Master 在写入数据到本地后,会等待 Slave 同步成功后才返回写入成功,这种方式能保证数据的强一致性,但性能相对较低。异步复制是指 Master 在写入本地成功后就返回写入成功,同时异步将数据复制到 Slave,这种方式性能较高,但在 Master 故障时可能会丢失少量数据。
NameServer、Broker 组件在高可用架构中的作用及协作方式
- NameServer 的作用:
- 元数据管理:负责存储 Broker 的元数据信息,包括 Broker 的地址、Topic 与 Broker 的映射关系等。
- 服务发现:为 Producer 和 Consumer 提供 Broker 元数据的查询服务,帮助它们找到对应的 Broker 节点。
- Broker 的作用:
- 消息存储与转发:Master Broker 负责接收 Producer 发送的消息,并存储到本地磁盘,同时向 Consumer 提供消息拉取服务。Slave Broker 从 Master Broker 同步数据,用于在 Master 故障时进行切换。
- 负载均衡:不同的 Broker 可以负责不同 Topic 的消息处理,通过合理的配置和部署,实现消息处理的负载均衡。
- 协作方式:
- Broker 与 NameServer 协作:Broker 在启动时,会定时向所有 NameServer 实例注册自己的元数据信息,并保持心跳。NameServer 会维护这些 Broker 信息。
- Producer、Consumer 与 NameServer、Broker 协作:Producer 和 Consumer 在启动时,会从 NameServer 拉取 Broker 元数据。Producer 根据元数据将消息发送到对应的 Broker,Consumer 根据元数据从 Broker 拉取消息。当 Broker 发生变化(如新增、删除、Master - Slave 切换等)时,NameServer 中的元数据会更新,Producer 和 Consumer 会定时从 NameServer 重新拉取元数据,从而感知到这些变化,保证系统的正常运行。