RocketMQ如何进行负载均衡和故障转移?

RocketMQ的负载均衡和故障转移主要依靠NameServer与Broker实现。

NameServer主要负责:

  • 存储集群broker信息:Broker名称、地址、所属集群名称等。
  • 为生产者与消费者提供路由信息:根据Topic名称返回相应broker信息。
  • 监控broker健康状态:定期接收broker的心跳包,如果超过一定时间没有收到心跳,则标记该broker为失效。

Broker主要负责:

  • 向NameServer定期发送心跳包报告自身运行状态。
  • 启动时从NameServer获取集群其他Broker信息并建立长连接。
  • 如果检测到某Broker失效,会立即断开与其的连接。

RocketMQ的负载均衡与故障转移主要流程:

  1. 生产者/消费者向NameServer请求路由信息,获取broker地址列表。
  2. NameServer返回主从broker地址列表,并且主broker排在前面。
  3. 生产者/消费者优先连接主broker,如果连接失败再连接从broker。
  4. Broker定期向NameServer发送心跳包,如果NameServer超过一定时间没有收到某Broker的心跳,则将其标记为失效。
  5. NameServer在给客户端返回路由信息时,会过滤失效的Broker,将其从列表中移除。
  6. 客户端在Broker列表变更时,会主动断开失效Broker的连接,并将新列表的Broker作为主Broker。
  7. 如果某Broker与其他Broker失去连接超过一定时间,则视为网络故障,会主动关闭自身。

RocketMQ是基于主从结构的关系来实现负载均衡。生产者/消费者优先连接主broker,如果连接失败会连接从broker。这可以实现简单的负载均衡。

另外,RocketMQ基于长连接机制与心跳检测来实现故障转移。 NameServer标记失效broker,剔除其路由列表发给客户端。客户端检测到broker失效或网络故障会主动断开连接转而链接其他可用broker。这可以实现自动的故障转移与高可用。