Rocketmq 總結 (一) -- NameServer
阿新 • • 發佈:2021-06-26
一 概述
NameServer的主要作用是,
1 路由功能。生產者查詢NameServer,根據Topic選擇它要傳送的MessageQueue。
2 通過和每個broker傳送心跳,更新註冊資訊,剔除失效broker
二 主要成員變數
public class RouteInfoManager { private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.NAMESRV_LOGGER_NAME); private final static longBROKER_CHANNEL_EXPIRED_TIME = 1000 * 60 * 2; private final ReadWriteLock lock = new ReentrantReadWriteLock(); private final HashMap<String/* topic */, List<QueueData>> topicQueueTable; private final HashMap<String/* brokerName */, BrokerData> brokerAddrTable; private finalHashMap<String/* clusterName */, Set<String/* brokerName */>> clusterAddrTable; private final HashMap<String/* brokerAddr */, BrokerLiveInfo> brokerLiveTable; private final HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable;
其實就是一個個的map儲存著broker的資訊。
topicQueueTable只是儲存著broker的名字,而具體的ip資訊在brokerAddrTable 裡。
brokerLiveTable是定時向broker傳送心跳包,然後收到心跳包之後更新時間戳。
過程如下,broker啟動的時候向所有NameServer傳送心跳,然後每隔30s向所有NameServer傳送心跳包。NameServer收到Broker心跳包時會更新brokerLiveTable快取中BrokerLiveInfo的lastUpdateTimeStamp,然後NameServer會每隔10s掃描brokerLiveTable,如果連續120s沒有收到心跳包,NameServer將移除該Broker的路由資訊同時關閉Socket連結。
三 路由發現
如果發生了broker上線或者下線,NameServer不會主動通知生產者或 消費者。而是靠客戶端主動拉取。