简介
RocketMQ 路由注册与删除是通过 Broker 与 NameServer 的心跳功能实现的。Broker 启动时向集群中所有的 NameServer 发送心跳语句,每隔 30s 向集群中所有 NameServer 发送心跳包,NameServer 收到 Broker 心跳包时会更新 brokerLiveTable 中的 lastUpdateTimestamp,然后 NameServer 每隔 10s 扫描 brokerLiveTable, 如果连续 120s 没有收到心跳包,NameServer 将移除该 Broker 的路由信息。
路由信息
路由实现类是 org.apache.rocketmq.namesrv.routeinfo.RouteInfoManager
- topicQueueTable:Topic 消息队列路由信息,消息发送时根据路由表进行负载均衡。
- brokerAddrTable:Broker 基础信息,包含 brokerName、所属集群名称、主备 Broker 地址。
- clusterAddrTable:Broker 集群信息,存储集群中所有 Broker 名称。
- brokerLiveTable:Broker 状态信息。NameServer 每次收到心跳包会更新该信息。
- filterServerTable:Broker 上的 FilterServer 列表,用于类模式消息过滤。
路由注册
路由注册过程描述如下:
- Broker 启动时会向所有 NameServer 注册路由,然后启动一个定时任务,每隔 30s 发送心跳包;
- BrokerOuterAPI 中的 registerBrokerAll 实际上是通过 Netty 客户端将注册路由的请求发往 NameServer 的 Netty 服务端;
- NameServer 的 Netty 服务端接受到请求后,交给 DefaultRequestProcessor 的 processRequest 处理,最后委托给了 RouteInfoManager 的 registerBroker 方法,填充或者更新路由信息。
路由删除
在 NamesrvController 的 initialize 启动了个定时任务每隔 10s 扫描 brokerLiveTable,如果连续 120s 没有收到心跳包,NameServer 将移除该 Broker 的路由信息