RocketMQ之-NameServer 路由注册、故障剔除

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 链接。apache

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 有两个触发点来触发路由删除 。bash

  • NameServer定时扫描 brokerLiveTable检测上次心跳包与 当前系统时间的时间差, 若是时间戳大于 120s,则须要移除该 Broker 信息 。架构

  • Broker在正常被关闭的状况下,会执行 unr巳gisterBroker指令。spa

实现方法 RouteInfoManager#scanNotActiveBroker()

4.总结

相关文章
相关标签/搜索