天天看點

RocketMQ 源碼分析02 NameServer

RocketMQ 源碼分析02 NameServer
RocketMQ 源碼分析02 NameServer

Broker消息伺服器 啟動時向所有NameServer注冊,Producer在發送消息之前從NameServer擷取Broker伺服器位址清單。然後根據負載算法從清單中選擇一個Broker進行消息發送。

每一台broker與配置中心NameServer保持長連接配接。每30秒檢測Broker是否存活,檢測到當機的話,就從路由系統資料庫中将其移除。

NameServer部署多台伺服器,但是彼此之間互不通信。單台nameserver挂掉,不影響其他nameserver,即使全部挂掉,也不影響業務系統使用。無狀态

Nameserver不會有頻繁的讀寫,是以性能開銷非常小,穩定性很高。

NameServer 啟動流程

啟動類NamesrvStartup

RocketMQ 源碼分析02 NameServer

1.建立和啟動對應的NamesrvController,然後解析加載配置檔案namesrvConfig和nettyServerConfig,如下圖

RocketMQ 源碼分析02 NameServer

然後是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讀鎖
           
RocketMQ 源碼分析02 NameServer

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

NameServerController的start方法

RocketMQ 源碼分析02 NameServer

1.啟動remotingServer,也就是開啟服務端serverBootStrap

RocketMQ 源碼分析02 NameServer

2.然後對本地位址進行綁定,并且擷取端口port

RocketMQ 源碼分析02 NameServer

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

NameServer 路由注冊

RocketMQ 源碼分析02 NameServer
RocketMQ 源碼分析02 NameServer

下面來看Broker的注冊

RocketMQ 源碼分析02 NameServer

主要是對clusterAddrTable 和 brokerAddrTable的維護。包括監聽變化,更新,删除,反注冊

RocketMQ 源碼分析02 NameServer

實作為記憶體的HashMap

Broker 給NameServer 發送心跳包,NameServer處理

RocketMQ 源碼分析02 NameServer

按照不同的requestCode ,執行對broker不同的管理動作

如果是更新nameServer的配置config,調用以下方法更新

RocketMQ 源碼分析02 NameServer
RocketMQ 源碼分析02 NameServer

1.更新之前,使用寫鎖

2.校驗屬性必須存在

3.更新合并配置檔案

4.新增配置資料的版本号

5.最後調用persist方法,持久化到檔案

Topic 路由發生變化時,是由用戶端主動拉topic最新的路由。NameServer不主動推送給用戶端

RocketMQ 源碼分析02 NameServer
mq