org.apache.rocketmq.namesrv.routeinfo.RouteInfoManager
复制代码
RocketMQ 基于订阅发布机制,一个Topic 拥有多个消息队列,一个Broker为每个主题默认建立4个读队列4个写队列。多个Broker 组成一个集群,BrokerName 有相同的多台Broker组成Master-slave架构, brokerId 为0 表明Master;大于0表明Slave。BrokerLiveInfo 中的lastUpdateTimestamp存储上次收到broker 心跳包的时间。
RocketMQ 注册是经过Broker 与NameServer 的心跳机制实现的。Broker 启动的时候向集群中全部的NameServer 发送心跳语句,每隔30s 向集群中全部的NameServer 发送心跳包,NameServer 收到Broker 心跳包时会更新brokerLiveTable缓存中BrokerLiveInfo 的lastUpdateTimestamp,而后NameServer 每隔10s扫描brokerLiveTable,若是连续120s 没有收到心跳包,NameServer 将移除该Broker 的路由信息同时关闭Socket 链接。
apache
Broker 端心跳包发送|BrokerController.start缓存
registerBrokerAll->doRegisterBrokerAll->brokerOuterAPI.registerBrokerAll->brokerOuterAPI.registerBroker
复制代码
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 有两个触发点来触发路由删除 。bash
NameServer定时扫描 brokerLiveTable检测上次心跳包与 当前系统时间的时间差, 若是时间戳大于 120s,则须要移除该 Broker 信息 。架构
Broker在正常被关闭的状况下,会执行 unr巳gisterBroker指令。spa