今天我們來一起深入分析 RocketMQ的注冊中心 NameServer。
本文基于 RocketMQ release-5.2.0。
首先,我們回顧下 RocketMQ的內核原理鳥瞰圖:
心跳機制是 NameServer維護 Broker的路由信息最重要的一個抓手,主要分為接收心跳、處理心跳、心跳超時 3部分:
Broker每 30s會向所有的 NameServer發送心跳包,告訴它們自己還存活著,從而更新自己在 NameServer的狀態,整體交互如下圖:
NameServer收到心跳包時會更新 brokerLiveTable緩存中 BrokerLiveInfo的 lastUpdateTimeStamp信息,整體交互如下圖:
處理邏輯可以參考源碼:org.apache.rocketmq.namesrv.processor.DefaultRequestProcessor#processRequest#brokerHeartbeat:
public RemotingCommand brokerHeartbeat(ChannelHandlerContext ctx, RemotingCommand request) throws RemotingCommandException { final RemotingCommand response = RemotingCommand.createResponseCommand(null); final BrokerHeartbeatRequestHeader requestHeader = (BrokerHeartbeatRequestHeader) request.decodeCommandCustomHeader(BrokerHeartbeatRequestHeader.class); this.namesrvController.getRouteInfoManager().updateBrokerInfoUpdateTimestamp(requestHeader.getClusterName(), requestHeader.getBrokerAddr()); response.setCode(ResponseCode.SUCCESS); response.setRemark(null); return response;}
NameServer每隔 10s(每隔5s + 5s延遲)掃描 brokerLiveTable檢查 Broker的狀態,如果在 120s內未收到 Broker心跳,則認為 Broker異常,會從路由表將該 Broker摘除并關閉 Socket連接,同時還會更新路由表的其他信息,整體交互如下圖:
private void startScheduleService() {this.scanExecutorService.scheduleAtFixedRate(NamesrvController.this.routeInfoManager::scanNotActiveBroker, 5, this.namesrvConfig.getScanNotActiveBrokerInterval(), TimeUnit.MILLISECONDS);}
源碼參考:org.apache.rocketmq.namesrv.routeinfo.RouteInfoManager#unRegisterBroker(),核心流程:
NameServer的啟動類為:org.apache.rocketmq.namesrv.NamesrvStartup,整個流程如下圖:
NameServer啟動最核心的 3個事情是:
NameServer并沒有采用復雜的分布式協議來保持數據的一致性,而是采用 CAP理論中的 AP,各個節點之間是Peer to Peer的對等關系,數據的一致性通過心跳機制,定時器,延時感知來完成。
本文鏈接:http://www.tebozhan.com/showinfo-26-93682-0.html代碼很少,卻很優秀!RocketMQ的NameServer是如何做到的?
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: React 實現給密碼輸入框加上【密碼強度】展示?
下一篇: 建議直接收藏的三個 Go 庫