RocketMQ網絡部署圖
![RocketMQ的核心——深入探秘namesrv](http://p2.ttnews.xyz/loading.gif)
NameServer:在系統中是做命名服務,更新和發現 broker服務。
Broker-Master:broker 消息主機服務器。
Broker-Slave: broker 消息從機服務器。
Producer: 消息生產者。
Consumer: 消息消費者。
說明: rocketmq系列都將會以rocketmq-4.1.0-incubating進行介紹。
今天的主題還是討論namesrv,接著上篇RocketMQ(五):namesrv初探,繼續談談namesrv,介紹namesrv前先介紹一個很重要的概念:topic,一般的服務註冊發現都相對簡單,但是在rocketmq裡面就相對比較複雜了,因為整個過程都與topic息息相關,我覺得一篇一定不夠,後續會繼續補說明講解。
Topic為何物
Topic是消息中間件裡一個重要的概念,每一個Topic代表了一類消息,有了多個Topic,就可以對消息進行歸類與隔離。
可以參照下圖的動物園餵食模型,每一種動物都只能消費相對應的食品。
img
分區(Queue)為何物
RocketMQ是磁盤消息隊列的模式,對於同一個消費組,一個分區只支持一個消費線程來消費消息。過少的分區,會導致消費速度大大落後於消息的生產速度。所以在實際生產環境中,一個Topic會設置成多分區的模式,來支持多個消費者,參照下圖:
img
代碼層
查看代碼結構如圖,看起來很少,其實很多公用的被放到其他地方了,由於需要提高給註冊和查詢(而且是多jvm進程中,所以需要rpc通信,查看之前寫的:RocketMQ(二):RPC通訊)由於需要交互broker如何註冊上namesrv的,其實就是rpc裡面說的通訊以及到那裡處理就是本模塊的DefaultRequestProcessor處理,根據編碼進行具體各各事情處理,重點關注註冊borker信息。
Broker註冊需要攜帶的信息:
集群名稱
地址
broker名稱
brokerId (0 表示 Master,>0 表示 Slave)
HA地址(主備通信交互,一般都是為broker的ip,端口+1)
Topic配置(topic名稱,讀寫隊列數據,權限等信息)
filterServerList
channel
假如我們需要搭建的集群為下圖模式:
實例代碼:
TopicConfigSerializeWrapper topicConfigSerializeWrapper = new TopicConfigSerializeWrapper();ConcurrentHashMaptopicConfigConcurrentHashMap = 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 (), channel);RegisterBrokerResult registerBrokerResult = routeInfoManager.registerBroker("rocketmq-cluster", "192.168.116.116:10911", "broker-b", 0, "192.168.116.115:10912", topicConfigSerializeWrapper, new ArrayList (), channel);RegisterBrokerResult registerBrokerResult = routeInfoManager.registerBroker("rocketmq-cluster", "192.168.116.115:11911", "broker-b", 1, "192.168.116.115:11912", topicConfigSerializeWrapper, new ArrayList (), channel);RegisterBrokerResult registerBrokerResult = routeInfoManager.registerBroker("rocketmq-cluster", "192.168.116.116:11911", "broker-a", 1, "192.168.116.115:11912", topicConfigSerializeWrapper, new ArrayList (), channel);
下面我們簡單描述下各各關係,
namesrv集群:
BrokerData關係:
QueueData關係:
根據topic獲取TopicRouteData:
參考
閱讀更多 java進階架構師 的文章