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

参考


分享到:


相關文章: