0717-7821348
欢乐彩直播app

欢乐彩直播app

您现在的位置: 首页 > 欢乐彩直播app
欢乐彩手机版下载-出产环境下 RocketMQ 为什么不能敞开主动创立主题?
2019-06-24 22:51:10

作者 | 丁威

责编 | 胡巍巍

现象

许多网友会问,为什么分明集群中有多台Broker服务器,autoCreateTopicEnable设置为true,表明敞开Topic主动创立,但新创立的Topic的路由信息只包括在其中一台Broker服务器上,这是为什么呢?

期望值:为了音讯发送的高可用,期望新创立的Topic在集群中的每台Broker上创立对应的行列,防止欢乐彩手机版下载-出产环境下 RocketMQ 为什么不能敞开主动创立主题?Broker的单节点毛病。

Broker集群信息

topicTest5路由信息

正如上图所示,主动创立的topicTest5的路由信息:

咱们再来看一下RocketMQ默许topic的路由信息截图如下:

从图中能够默许Topic的路由信息为broker-a、broker-b上各8个行列。

考虑

默许Topic的路由信息是怎么创立的?

原理

3.1 RocketMQ根本路由规矩

回到本文月下蝶影的主题:autoCreateTopicEnable,敞开主动创立主题,试想一下,假如生产者向一个不存在的主题发送音讯时,上面的任何一个进程都无法获取到路由信息,那该怎么处理这种状况呢?

在RocketMQ中,假如autoCreateTopicEnable设置为true,音讯发送者向NameServer查询主题的路由音讯回来空时,会测验用一个体系默许的主题称号(MixAll.AUTO_CREATE_TOPIC_KEY_TOPIC),此刻音讯发送者得到的路由信息为:

默许Topic在集群的每一台Broker上创立8个行列,那问题来了,为啥新创立的Topic只在一个Broker上创立4个行列呢?

3.2 探求autoCreateTopicEnable机制3.2.1 默许Topic路由创立机制

温馨提示:本文不会详细盯梢整个创立进程,只会点出源码的要害进口点,如想详细了解NameServer路由音讯、音讯发送高可用的完成原理,主张查阅笔者的书本《RocketMQ技能内情》第二、三章。

Step1:在Broker发动流程中,会构建TopicConfigManager目标,其结构办法中首要会判别是否敞开了答应主动创立主题,假如启用了主动创立主题,则向topicConfigTable中增加默许主题的路由信息。

TopicConfigManager结构办法

补白:该topicConfigTable中所有的路由信息,会跟着Broker向Nameserver发送心跳包中,Nameserver收到这些信息后,更新对应Topic的路由信息表。

BrokerConfig的defaultTopicQueueNum默许为8。两台Broker服务器都会运转上面的进程,故终究Na欢乐彩手机版下载-出产环境下 RocketMQ 为什么不能敞开主动创立主题?meserver中关于默许主题的路由信息中,会包括两个Broker别离各8个行列信息。

Step2:生产者寻觅路由信息

生产者首要向NameServer查询路由信息,由所以一个不存在的主题,故此刻回来的路由信息为空,RocketMQ会运用默许的主题再次寻觅,由于敞开了主动创立路由信息,NameServer会向生产者回来默许主题的路由信息。然后从回来的路由信息中挑选一个行列(默许轮询)。音讯发送者从Nameserver获取到默许的Topic的行列信息后,行列的个数会改动吗?答案是会的,其代码如下:

MQClientInstance#updateTopicRouteInfoFromNameServer

温馨提示:音讯发送者在到默许路由信息时,其行列数量,会挑选DefaultMQProducer#defaultTopicQueueNums与Nameserver回来的的行列数取最小值,DefaultMQProducer#defaultTopicQueueNums默许值为4,故主动创立的主题,其行列数量默许为4。

Step3:发送音讯

DefaultMQProducerImpl#sendKernelImpl

在音讯发送时的恳求报文中,设置默许topic称号,音讯发送topic称号,运用的行列数量为DefaultMQProducer#defaultTopicQueueNums,即默许为4。

Step4:Broker端收到音讯后的处理流程

服务端收到音讯发送的处理器为:SendMessageProcessor,在处理音讯发送时,会调用super.msgCheck办法:

AbstractSendMessageProcessor#msgCheck

在Broker端,首要会运用TopicConfigManager依据topic查询路由信息,假如Broker端不存在该主题的路由装备(路由信息),此刻假如Broker中存在默许主题的路由装备信息,则依据音讯发送恳求中的行列数量,在Broker创立新Topic的路由信息。这样Broker服务端就会存在主题的路由信息。

在Broker端的topic装备管理器中存在的路由信息,一会向Nameserver发送心跳包,汇签到Nameserver,另一方面会有一个守时使命,守时存储在broker端,详细途径为${ROCKET_HOME}/store/config/topics.json中,这样在Broker封闭后再重启,并不会丢掉路由信息。

广大读者朋友,盯梢到这一步的时分,咱们应该对启用主动创立主题机制时,新主题的路由信息是怎么创立的,为了便利了解,给出创立主题序列图:

3.2.2 现象剖析

通过上面主动创立路由机制的创立流程,咱们能够比较简单的剖析得出如下定论:

由于敞开了主动创立路由信息,音讯发送者依据Topic去NameServer无法得到路由信息,但接下来依据默许Topic从NameServer是能拿到路由信息(在每个Broker中,存在8个行列),由于两个Broker在发动时都会向NameServer报告路由信息。此刻音讯发送者缓存的路由信息是2个Broker,每个Broker默许4个行列(原因见3.2.1:Step2的剖析)。

音讯发送者然后依照轮询机制,发送第一条音讯挑选(broke欢乐彩手机版下载-出产环境下 RocketMQ 为什么不能敞开主动创立主题?r-a的messageQueue:0),向Broker发送音讯,Broker服务器在处理音讯时,首要会检查自己的路由装备管理器(TopicConfigManager)中的路由信息,此刻不存在对应的路由信息,然后测验查询是否存在默许Topic的路由信息,假如存在,阐明启用了autoCreateTopicEnable,则在TopicConfigManager中创立新Topic的路由信息,此刻存在与Broker服务端的内存中,然后本次音讯发送完毕。此刻,在NameServer中还不存在新创立的Topic的路由信息。

这儿有三个要害点:

原因就剖析到这儿了,现在咱们还能够的斗胆假定,敞开autoCreateTopicEnable机制,什么状况会在两个Broker上都创立行列,其实,咱们只需要接连快速的发送9条音讯,就有可能在2个Broker上都创立行列,验证代码如下:

1publicstaticvoidmain(String[] args) throws MQClientException, InterruptedException {

2DefaultMQProducer producer = newDefaultMQProducer("please_rename_unique_group_name");

3producer.setNamesrvAddr("127.0.0.1:9876");

4producer.start;

5for(inti = 0; i < 9; i++) {

6try{

7Message msg = newMessage("TopicTest10","TagA", ("Hello RocketMQ "+ i).getBytes(RemotingHelper.DEFAULT_CHARSET));

8SendResult sendResult = producer.send(msg);

9System.out.printf("%s%n", sendResult);

10} catch(Exception e) {

11e.printStackTrace;

12Thread.sleep(1000);

13}

14}

15produ欢乐彩手机版下载-出产环境下 RocketMQ 为什么不能敞开主动创立主题?cer.shutdown;

16}

作者简介:丁威,CSDN 博客专家,《RocketMQ技能内情》作者,保护大众号”中间件爱好圈“。现在上任于中通科技技能欢乐彩手机版下载-出产环境下 RocketMQ 为什么不能敞开主动创立主题?平台部,担任架构师,担任音讯中间件、全链路压测的落地作业。

声明:该文观念仅代表作者自己,搜狐号系信息发布平台,搜狐仅供给信息存储空间服务。