roceketmq自动创建topic踩过的坑

RocketMQ在发送新Topic消息时,若自动创建Topic功能开启,可能导致消息只发送到某一台Broker,影响负载均衡。建议关闭此功能,手动创建Topic以确保正确路由。此外,创建Topic后的Queue数目可能不生效。分析了自动创建Topic的流程,揭示了可能的隐患。
摘要由CSDN通过智能技术生成

1.

RocketMQ在发送消息时,会首先获取路由信息。如果是新的消息,由于MQServer上面还没有创建对应的Topic,这个时候,如果上面的配置打开的话,会返回默认Topic的(RocketMQ会在每台broker上面创建名为TBW102的Topic)路由信息,然后Producer会选择一台Broker发送消息,选中的broker在存储消息时,发现消息的Topic还没有创建,就会自动创建Topic。后果就是:以后所有该Topic的消息,都将发送到这台broker上,达不到负载均衡的目的。

所以基于目前RocketMQ的设计,建议关闭自动创建Topic的功能,然后根据消息量的大小,手动创建Topic。

 

2. 创建主题后生成的queue的数目,也可能不生效。

 

自动创建
默认情况下,topic不用手动创建,当producer进行消息发送时,会从nameserver拉取topic的路由信息,如果topic的路由信息不存在,那么会默认拉取broker启动时默认创建好名为“TBW102”的Topic:

org.apache.rocketmq.common.MixAll:
 

// Will be created at broker when isAutoCreateTopicEnablepublic static final String AUTO_CREATE_TOPIC_KEY_TOPIC = "TBW102";
public static final String AUTO_CREATE_TOPIC_KEY_TOPIC = "TBW102";

自动创建的开关配置在BrokerConfig中,通过autoCreateTopicEnable字段进行控制,

org.apache.rocketmq.common.BrokerConfig:

@ImportantFieldprivate boolean autoCreateTopicEnable = true;
private boolean autoCreateTopicEnable = true;

在broker启动时,会调用TopicConfigManager的构造方法,autoCreateTopicEnable打开后,会将“TBW102”保存到topicConfigTable中:

org.apache.rocketmq.broker.topic.TopicConfigManager#TopicConfigManager:
 

// MixAll.AUTO_CREATE_TOPIC_KEY_TOPICif (this.brokerController.getBrokerConfig().isAutoCreateTopicEnable()) {    String topic = MixAll.AUTO_CREATE_TOPIC_KEY_TOPIC;    TopicConfig topicConfig = new TopicConfig(topic);    this.systemTopicList.add(topic);    topicConfig.setReadQueueN
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值