NameServer路由发现及删除
路由发现
RocketMQ中的路由发现是由客户端主动(生产者与消费者)发起的,NameServer不会主动推送路由信息给客户端
客户端发送RequestCode = RequestCode.GET_ROUTEINFO_BY_TOPIC的请求给NameServer时,会由NameServer中的DefaultRequestProcessor
进行处理
DefaultRequestProcessor#getRouteInfoByTopic
路由删除
RocketMQ中路由的删除有两种方式,
- 通过NameServer的定时检查机制检测到Broker状态非正常
- Broker正常退出,调用unregisterBroker指令
路由的删除,就是将brokerAddrTable,filterServerTable,brokerLiveTable,topicQueueData中将要删除Broker的相关信息都移除掉
NameServer的定时检查机制导致的路由删除
NameServer的启动流程一文中讲到,在启动过程中,NameServer会注册一个定时任务,每10s执行RouteInfoManager#scanNotActiveBroker
一次这个方法,来检查brokerLiveTable中每个Broker的lastUpdateTimestamp与当前时间的间隔,如果超过120s,则NameServer认为该Broker已经故障了,就会触发对该Broker的移除,维护其相关的路由表
- 申请写锁
- 移除brokerLiveTable中关于该Broker的信息
- 移除filterServerTable中关于该Broker的信息
- 移除brokerAddrTable中关于该Broker的信息,从该table中根据brokerName找到对应的BrokerData,然后移除该broker,如果移除后该BrokerData中没有其他Broker了,则删除该BrokerData
- 移除clusterAddrTable中关于该Broker的信息,如果删除Broker后该集群中中不包含任何的Broker了,则删除该集群信息
- 移除topicQueueTable中关于该Broker的信息,如果删除Broker后,该topic中不包含任何Broker了,则删除该Topic
- 释放写锁
Broker正常退出时的路由删除
删除过程与上面的类似,只不过用该方式删除是通过Broker向NameServer发送请求来完成的,其对应的RequestCode为UNREGISTER_BROKER