问题现象
RocketMQ3.2.2版本,测试时尝试发送消息时自动创建Topic,设置了队列数量为8:
producer.setDefaultTopicQueueNums(8);
同时设置broker服务器的配置文件broker.properties:
defaultTopicQueueNums=16
但实际创建后从控制台及后台打印代码观察到该Topic只创建了4个队列,反复重试确认发送消息时自动创建Topic,最大创建4个队列。
查找原因
服务端与客户端配置对比
阅读源码,在TopicConfigManager的createTopicInSendMessageMethod方法,有对比TopicConfig对象中的队列数和客户端设定队列数,并选择其中较小者为新建Topic队列数的逻辑:
int
queueNums = clientDefaultTopicQueueNums > defaultTopicConfig.getWriteQueueNums() ? defaultTopicConfig
.getWriteQueueNums() : clientDefaultTopicQueueNums;
定位问题在服务端TopicConfig
打印这两个变量:
客户队列数clientDefaultTopicQueueNums为8,正确;
而defaultTopicConfig.getWriteQueueNums()为4,而非broker.properties中设定的16;
由可以确定是问题出在defaultTopicConfig上。
defaultTopicConfig数据来源
defaultTopicConfig是从ConcurrentHashMap<String, TopicConfig> topicConfigTable中取得,如下:
TopicConfig defaultTopicConfig = this.topicConfigTable.get(defaultTopic);
而defaultTopic默认值为MixAll.DEFAULT_TOPIC=“TBW102”。
为了确认topicConfigTable中的为MixAll.DEFAULT_TOPIC的Config对象属性值的真实来源,继续阅读源码,发现borker有两处改写DEFAULT_TOPIC的Config对象的位置:
一处是TopicConfigManager的构造方法,在borker服务器启动时运行,会读取broker.properties里的配置,此时DEFAULT_TOPIC的Config对象里的DefaultQueueNums为正确的我所配置的16;
一处是在BrokerController的initialize方法里调用了TopicConfigManager.load方法:
该load方法继承自ConfigManager类,读取了$ROCKETMQ_HOME\store\config下保存的配置信息,并调用抽象方法decode(),配置信息作为json字符串参数传入到decode();
TopicConfigManager类的decode实现方法里,读取了$ROCKETMQ_HOME\store\config\topics.json里的配置信息,并覆写到topicConfigTable,而此前生成的topics.json的“TBW102”的配置信息里的writeQueueNums及readQueueNums均为4。
最终结论
在发送消息自动创建Topic时,对于此前已运行的borker服务器,修改配置文件的defaultTopicQueueNums属性的值不起作用。
因为发送消息自动创建Topic的实现里,队列数取小对比操作的变量——defaultTopicConfig写在topics.json的配置信息里的writeQueueNums及readQueueNums,读取自Topics.json,所以即使修改配置文件并重启borker服务器后也不会改变。而服务端最终会用topics.json的值覆盖发送消息自动创建Topic时的TopicConfig配置信息。
阿里的解释
队列是资源,所以管控权会放到服务器。
但是每个用户的默认策略又不一样,所以会有一个默认topic作为模板,在未创建默认topic前,系统会自动创建一个。
这个可以占到运维的角度思考,例如你运维了10个集群,为1000个用户服务。有些用户需要动态的创建topic,但是不能给他足够的权限,想创建多少创建多少。
所有会给他一个模板的topic,就是defaultTopic,动态创建topic继承于defaultTopic配置,队列数不能超过defaultTopic。
解决办法
- 通过producer.createTopic方法创建;
- 通过控制台方式创建;
- 修改metaq源码重新编译borker,使用broker的配置信息覆盖defaultTopic的配置信息。
RocketMQ3.2.2生产者发送消息自动创建Topic队列数无法超过4个的更多相关文章
-
深入研究RocketMQ生产者发送消息的底层原理
前言 hello,小伙伴们,王子又来和大家研究RocketMQ的原理了,之前的文章RocketMQ生产部署架构如何设计中,我们已经简单的聊过了生产者是如何发送消息给Broker的. 我们简单回顾一下这 ...
-
kafka 生产者发送消息
KafkaProducer 创建一个 KafkaThread 来运行 Sender.run 方法. 1. 发送消息的入口在 KafkaProducer#doSend 中,但其实是把消息加入到 batc ...
-
Kafka生产者发送消息的三种方式
Kafka是一种分布式的基于发布/订阅的消息系统,它的高吞吐量.灵活的offset是其它消息系统所没有的. Kafka发送消息主要有三种方式: 1.发送并忘记 2.同步发送 3.异步发送+回调函数 下 ...
-
kafka-0.10.2.1:Producer生产时无法自动创建Topic
集群环境: CenterOS 1台 Kafka:0.10.2.1版本. 今天在测试环境下,我们的Kafka集群工作不正常,具体现象为,使用confulentkafka向kafka集群生产消息失败,且并 ...
-
Kafka学习笔记(6)----Kafka使用Producer发送消息
1. Kafka的Producer 不论将kafka作为什么样的用途,都少不了的向Broker发送数据或接受数据,Producer就是用于向Kafka发送数据.如下: 2. 添加依赖 pom.xml文 ...
-
大数据_Kafka_Kafka自动创建不存在的Topics / 删除已存在的Topics
大数据_Kafka_Kafka自动创建不存在的Topics / 删除已存在的Topics 2016年10月11日 18:22:59 高达一号 阅读数:8655 版权声明:本文为博主原创文章,未经博 ...
-
MSMQ-发送消息到远程专用队列 实例
目录 一:MSMQ的一些理论上的知识 二:队列类型(Queue Type) 三:安装消息队列 四:在C#中Messagequeue class 五:MSMQ-发送消息到远程专用队列 六:例子 一. ...
-
MSMQ-发送消息到远程专用队列path格式
在工作组模式下,远程访问专用队列.在网上找到一篇文章,翻译了一下. 最后结论,直接使用多元素格式名方式,利用IP地址直接对单个或多个目标发送消息 MessageQueue rmQ = new ...
-
kafka7 探索生产者同步or异步发送消息
1.生产者:在发送完消息后,收到回执确认. 主要是在SimpleProducer.java中修改了发送消息的2行代码,用到了回调函数,修改如下: //发送消息 ProducerRecord<St ...
随机推荐
-
decimal(a,b)
decimal(a,b)a指定指定小数点左边和右边可以存储的十进制数字的最大个数,最大精度38.b指定小数点右边可以存储的十进制数字的最大个数.小数位数必须是从 0 到 a之间的值.默认小数位数是 0 ...
-
centos 安装 erlang
1.首先下载erlang 安装源文件 可以在官网上下载 : http://www.erlang.org/ 官网上提供多个版本: 2.下载完成后将R16B01 Source File对应的 ot ...
-
C# webBrowser操作 javascript
using System; using System.Windows.Forms; namespace Demo { public partial class Form1 : Form { publi ...
-
[Android]Volley源代码分析(店)应用
通过前面的谈话,我相信你有Volley有了一定的了解了原理.本章将给出一些我们的应用程序都可以在样品中直接使用,第一样品是 NetworkImageView类,事实上NetworkImageView顾 ...
-
[转载]Linux 环境下编译 0.11版本内核 kernel
最近在看<.如果Clobber/Modify 为空,则其前面的冒号(:)必须省略. 2.如果Output,Input,Clobber/Modify都为空,Output,Input之前的冒号(:) ...
-
Windows提示dll组件丢失
我们在运行一些软件时,常常会遇到这种问题.下面就来提供解决办法: 登陆网址:www.dll-files.com. 找到页面的搜索部分,并且进行相关搜索: 下图显示了相关的dll下载链接. 下载解压即可 ...
- java_jsp和servlet中乱码问题
- 第三个Sprint冲刺第六天(燃尽图)
-
amazon建立基于centos的ec2
在amazon上建立centos系统的ec2,主要就是系统要找对. 1.登录网址:amazonaws-china.com,注意这个网址是专门为在国内建立国外通用亚马逊ec2设立的,其他的是用国内的ec ...
-
js删除逗号
var aaa="123,432,34.00 aaa.replace(/,/g, '');