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.總結

相關文章
相關標籤/搜索