
Broker消息伺服器 啟動時向所有NameServer注冊,Producer在發送消息之前從NameServer擷取Broker伺服器位址清單。然後根據負載算法從清單中選擇一個Broker進行消息發送。
每一台broker與配置中心NameServer保持長連接配接。每30秒檢測Broker是否存活,檢測到當機的話,就從路由系統資料庫中将其移除。
NameServer部署多台伺服器,但是彼此之間互不通信。單台nameserver挂掉,不影響其他nameserver,即使全部挂掉,也不影響業務系統使用。無狀态
Nameserver不會有頻繁的讀寫,是以性能開銷非常小,穩定性很高。
NameServer 啟動流程
啟動類NamesrvStartup
1.建立和啟動對應的NamesrvController,然後解析加載配置檔案namesrvConfig和nettyServerConfig,如下圖
然後是controller的初始化,如下
NameServerController的初始化方法 initialize
1.this.kvConfigManager.load(); 加載kv配置
2.建立remotingExecutor線程池
3.開啟定時線程掃描NotActive狀态的broker, channel逾時,然後就銷毀對應的channel和broker
4.注冊一個listener,來重新加載sslContext
2.1.3 KVConfigManager
讀取或變更NameServer的配置屬性,加載 NamesrvConfig 中配置的配置檔案到記憶體,此類一個亮點就是使用輕量級的非線程安全容器HashMap,再結合寫鎖對資源讀寫進行保護。盡最大程度提高線程的并發度。
2.1.4 RouteInfoManager
NameServer 資料的載體,記錄 Broker、Topic 等資訊。
配置持久化persist,是存儲到檔案中,加讀鎖
getKVConfig 使用read讀鎖
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
NameServerController的start方法
1.啟動remotingServer,也就是開啟服務端serverBootStrap
2.然後對本地位址進行綁定,并且擷取端口port
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
NameServer 路由注冊
下面來看Broker的注冊
主要是對clusterAddrTable 和 brokerAddrTable的維護。包括監聽變化,更新,删除,反注冊
實作為記憶體的HashMap
Broker 給NameServer 發送心跳包,NameServer處理
按照不同的requestCode ,執行對broker不同的管理動作
如果是更新nameServer的配置config,調用以下方法更新
1.更新之前,使用寫鎖
2.校驗屬性必須存在
3.更新合并配置檔案
4.新增配置資料的版本号
5.最後調用persist方法,持久化到檔案
Topic 路由發生變化時,是由用戶端主動拉topic最新的路由。NameServer不主動推送給用戶端