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