RocketMQ的核心——深入探祕namesrv

RocketMQ網絡部署圖

RocketMQ的核心——深入探秘namesrv

  • 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,就可以對消息進行歸類與隔離。

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

RocketMQ的核心——深入探秘namesrv

img

分區(Queue)為何物

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

RocketMQ的核心——深入探秘namesrv

img

代碼層

RocketMQ的核心——深入探秘namesrv

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

RocketMQ的核心——深入探秘namesrv

Broker註冊需要攜帶的信息:

RocketMQ的核心——深入探秘namesrv

  • 集群名稱

  • 地址

  • broker名稱

  • brokerId (0 表示 Master,>0 表示 Slave)

  • HA地址(主備通信交互,一般都是為broker的ip,端口+1)

  • Topic配置(topic名稱,讀寫隊列數據,權限等信息)

  • filterServerList

  • channel

假如我們需要搭建的集群為下圖模式:

RocketMQ的核心——深入探秘namesrv

實例代碼:

TopicConfigSerializeWrapper topicConfigSerializeWrapper = new TopicConfigSerializeWrapper();ConcurrentHashMap 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(), 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關係:

RocketMQ的核心——深入探秘namesrv

RocketMQ的核心——深入探秘namesrv

QueueData關係:

RocketMQ的核心——深入探秘namesrv

根據topic獲取TopicRouteData:

RocketMQ的核心——深入探秘namesrv

RocketMQ的核心——深入探秘namesrv

參考


分享到:


相關文章: