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