匠心零度 转载请注明原创出处,谢谢!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:
若是读完以为有收获的话,欢迎点赞、关注、加公众号【匠心零度】,查阅更多精彩历史!!!
加入知识星球,一块儿探讨!