1. 程式人生 > >RocketMQ讀書筆記4——NameServer(MQ的協調者)

RocketMQ讀書筆記4——NameServer(MQ的協調者)

【NameServer簡述】

  對於一個訊息佇列叢集來說,系統由很多機器組成,每個機器的角色、IP地址都不相同,而且這些資訊是變動的(如在某些情況下,會有新的Producer或Consumer加入)。

  NameServer的存在主要是為了解決這類問題,由NameServer維護這些配置資訊、狀態資訊,其他角色都通過NameServer來協同執行。

 

【NameServer的功能】

  NameServer是整個訊息佇列中的狀態伺服器,叢集的各個元件通過它來了解全域性的資訊。各個角色的機器要定時向NameServer上報自己的狀態,如果超時未上報,NameServer會認為某個機器出故障不可用了,其他的元件會把這個機器從可用列表中刪除。

  NameServer可以部署多個,相互之間獨立,其他角色同時向多個NameServer上報狀態資訊,從而達到熱備份的目的。NameServer本身是無狀態的,也就是說NameServer中的Broker、Topic等資訊都不會持久化,都是由各個角色定時上報並存儲到記憶體中的(NameServer支援引數的持久化,一般用不到)。

 

【叢集狀態的儲存結構】

在RouterInfoManager中,有5個變數,叢集的狀態就儲存在這5個變數中。

    /**
     * 儲存所有Topic的屬性資訊
     */
    private final HashMap<String/*
topic */, List<QueueData>> topicQueueTable; /** * 儲存BrokerName對應的屬性資訊 */ private final HashMap<String/* brokerName */, BrokerData> brokerAddrTable; /** * 儲存叢集的資訊 */ private final HashMap<String/* clusterName */, Set<String/* brokerName */>> clusterAddrTable;
/** * 儲存Broker機器的實時狀態 */ private final HashMap<String/* brokerAddr */, BrokerLiveInfo> brokerLiveTable; /** * 儲存過濾伺服器資訊 */ private final HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable;