1.路由元信息
路由实现类RouteInfoManager
org.apache.rocketmq.namesrv.routeinfo.RouteInfoManager
路由原数据类图
RocketMQ 基于订阅发布机制,一个Topic 拥有多个消息队列,一个Broker为每一个主题默认创建4个读队列4个写队列。多个Broker 组成一个集群,BrokerName 有相同的多台Broker组成Master-slave架构, brokerId 为0 代表Master;大于0代表Slave。BrokerLiveInfo 中的lastUpdateTimestamp存储上次收到broker 心跳包的时间。
2.路由注册
RocketMQ 注册是通过Broker 与NameServer 的心跳机制实现的。Broker 启动的时候向集群中所有的NameServer 发送心跳语句,每隔30s 向集群中所有的NameServer 发送心跳包,NameServer 收到Broker 心跳包时会更新brokerLiveTable缓存中BrokerLiveInfo 的lastUpdateTimestamp,然后NameServer 每隔10s扫描brokerLiveTable,如果连续120s 没有收到心跳包,NameServer 将移除该Broker 的路由信息同时关闭Socket 连接。
Broker 发送心跳包流程分析
Broker 端心跳包发送|BrokerController.start
registerBrokerAll->doRegisterBrokerAll->brokerOuterAPI.registerBrokerAll->brokerOuterAPI.registerBroker
NameServer 处理心跳包
3.路由删除
Broker 每隔 30s 向 NameServer 发送一个心跳包,心跳包中包含 BrokerId、Broker地址、Broker名称、 Broker所属集群名称、Broker关联的 FilterServer列表。 但是如果 Broker若机 , NameServer无法收到心跳包,此时 NameServer如何来剔除这些失 效的 Broker 呢? Name Server会每隔 IOs 扫描 brokerLiveTable状态表,如果 BrokerLive 的 lastUpdateTimestamp 的时间戳距当前时间超过 120s,则认为 Broker失效,移除该 Broker, 关闭与Broker连接,并同时更新topicQueueTable、 brokerAddrTable、 brokerLiveTable、 filterServerTable。 RocktMQ 有两个触发点来触发路由删除 。
-
NameServer定时扫描 brokerLiveTable检测上次心跳包与 当前系统时间的时间差, 如果时间戳大于 120s,则需要移除该 Broker 信息 。
-
Broker在正常被关闭的情况下,会执行 unr巳gisterBroker指令。