NameServer路由发现及删除

路由发现

RocketMQ中的路由发现是由客户端主动(生产者与消费者)发起的,NameServer不会主动推送路由信息给客户端

客户端发送RequestCode = RequestCode.GET_ROUTEINFO_BY_TOPIC的请求给NameServer时,会由NameServer中的DefaultRequestProcessor进行处理

DefaultRequestProcessor#getRouteInfoByTopic

image.png

路由删除

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