RocketMQ(六):namesrv再探

匠心零度 轉載請註明原創出處,謝謝!java

RocketMQ網絡部署圖

  • NameServer:在系統中是作命名服務,更新和發現 broker服務。
  • Broker-Master:broker 消息主機服務器。
  • Broker-Slave: broker 消息從機服務器。
  • Producer: 消息生產者。
  • Consumer: 消息消費者。

說明: rocketmq系列都將會以rocketmq-4.1.0-incubating進行介紹。服務器

在閱讀源碼時作了必定的註釋,公衆號【匠心零度】回覆:rocketmq,可得到基於rocketmq4.1.0加詳細中文代碼註釋 。歡迎你們 star、fork !網絡

今天的主題仍是討論namesrv,接着上篇RocketMQ(五):namesrv初探,繼續談談namesrv,介紹namesrv前先介紹一個很重要的概念:topic,通常的服務註冊發現都相對簡單,可是在rocketmq裏面就相對比較複雜了,由於整個過程都與topic息息相關,我以爲一篇必定不夠,後續會繼續補說明講解。app

Topic爲什麼物

Topic是消息中間件裏一個重要的概念,每個Topic表明了一類消息,有了多個Topic,就能夠對消息進行歸類與隔離。jvm

能夠參照下圖的動物園餵食模型,每一種動物都只能消費相對應的食品。編碼

img

分區(Queue)爲什麼物

RocketMQ是磁盤消息隊列的模式,對於同一個消費組,一個分區只支持一個消費線程來消費消息。過少的分區,會致使消費速度大大落後於消息的生產速度。因此在實際生產環境中,一個Topic會設置成多分區的模式,來支持多個消費者,參照下圖:spa

img

代碼層

查看代碼結構如圖,看起來不多,其實不少公用的被放到其餘地方了,因爲須要提升給註冊和查詢(並且是多jvm進程中,因此須要rpc通訊,查看以前寫的:RocketMQ(二):RPC通信)因爲須要交互broker如何註冊上namesrv的,其實就是rpc裏面說的通信以及到那裏處理就是本模塊的DefaultRequestProcessor處理,根據編碼進行具體各各事情處理,重點關注註冊borker信息。線程

Broker註冊須要攜帶的信息:3d

  • 集羣名稱
  • 地址
  • broker名稱
  • brokerId (0 表示 Master,>0 表示 Slave)
  • HA地址(主備通訊交互,通常都是爲broker的ip,端口+1)
  • Topic配置(topic名稱,讀寫隊列數據,權限等信息)
  • filterServerList
  • channel

假如咱們須要搭建的集羣爲下圖模式: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集羣:

BrokerData關係:

QueueData關係:

根據topic獲取TopicRouteData:

參考

阿里RocketMQ


若是讀完以爲有收穫的話,歡迎點贊、關注、加公衆號【匠心零度】,查閱更多精彩歷史!!!

加入知識星球,一塊兒探討!

相關文章
相關標籤/搜索