匠心零度 轉載請註明原創出處,謝謝!java
說明: rocketmq系列都將會以rocketmq-4.1.0-incubating進行介紹。服務器
在閱讀源碼時作了必定的註釋,公衆號【匠心零度】回覆:rocketmq,可得到基於rocketmq4.1.0加詳細中文代碼註釋 。歡迎你們 star、fork !網絡
今天的主題仍是討論namesrv,接着上篇RocketMQ(五):namesrv初探,繼續談談namesrv,介紹namesrv前先介紹一個很重要的概念:topic,通常的服務註冊發現都相對簡單,可是在rocketmq裏面就相對比較複雜了,由於整個過程都與topic息息相關,我以爲一篇必定不夠,後續會繼續補說明講解。app
Topic是消息中間件裏一個重要的概念,每個Topic表明了一類消息,有了多個Topic,就能夠對消息進行歸類與隔離。jvm
能夠參照下圖的動物園餵食模型,每一種動物都只能消費相對應的食品。編碼
RocketMQ是磁盤消息隊列的模式,對於同一個消費組,一個分區只支持一個消費線程來消費消息。過少的分區,會致使消費速度大大落後於消息的生產速度。因此在實際生產環境中,一個Topic會設置成多分區的模式,來支持多個消費者,參照下圖:spa
查看代碼結構如圖,看起來不多,其實不少公用的被放到其餘地方了,因爲須要提升給註冊和查詢(並且是多jvm進程中,因此須要rpc通訊,查看以前寫的:RocketMQ(二):RPC通信)因爲須要交互broker如何註冊上namesrv的,其實就是rpc裏面說的通信以及到那裏處理就是本模塊的DefaultRequestProcessor處理,根據編碼進行具體各各事情處理,重點關注註冊borker信息。線程
Broker註冊須要攜帶的信息:3d
假如咱們須要搭建的集羣爲下圖模式:code
TopicConfigSerializeWrapper topicConfigSerializeWrapper = new TopicConfigSerializeWrapper();
ConcurrentHashMap<String, TopicConfig> topicConfigConcurrentHashMap = new ConcurrentHashMap<>();
TopicConfig topicConfig = new TopicConfig();
topicConfig.setWriteQueueNums(8);
topicConfig.setTopicName("test");
topicConfig.setPerm(6);
topicConfig.setReadQueueNums(8);
topicConfig.setOrder(false);
topicConfigConcurrentHashMap.put("test", topicConfig);
topicConfigSerializeWrapper.setTopicConfigTable(topicConfigConcurrentHashMap);
Channel channel = mock(Channel.class);
RegisterBrokerResult registerBrokerResult = routeInfoManager.registerBroker("rocketmq-cluster", "192.168.116.115:10911", "broker-a", 0, "192.168.116.115:10912",
topicConfigSerializeWrapper, new ArrayList<String>(), channel);
RegisterBrokerResult registerBrokerResult = routeInfoManager.registerBroker("rocketmq-cluster", "192.168.116.116:10911", "broker-b", 0, "192.168.116.115:10912",
topicConfigSerializeWrapper, new ArrayList<String>(), channel);
RegisterBrokerResult registerBrokerResult = routeInfoManager.registerBroker("rocketmq-cluster", "192.168.116.115:11911", "broker-b", 1, "192.168.116.115:11912",
topicConfigSerializeWrapper, new ArrayList<String>(), channel);
RegisterBrokerResult registerBrokerResult = routeInfoManager.registerBroker("rocketmq-cluster", "192.168.116.116:11911", "broker-a", 1, "192.168.116.115:11912",
topicConfigSerializeWrapper, new ArrayList<String>(), channel);
複製代碼
下面咱們簡單描述下各各關係, namesrv集羣:
QueueData關係:
根據topic獲取TopicRouteData:
若是讀完以爲有收穫的話,歡迎點贊、關注、加公衆號【匠心零度】,查閱更多精彩歷史!!!
加入知識星球,一塊兒探討!