问题:
在使用springboot集成RocketMQ Client后,开启自动创建队列,发现只会在一个Broker中创建Topic,但是在短时间内发送多条信息,就可以在集群情况下,在多个Broker中正确的创建Topic
要发多少条才能在集群模式下正确创建?
消息默认轮询方式,需要最少发送消息数量如下:(刷新路由前完成)
((Broker数量-1)* 每个Broker Queue的数量))-1
代码
将循环发送消息打开既可以正常在集群环境下自动创建队列
@Test
void producerAndSync() throws MQClientException, UnsupportedEncodingException, MQBrokerException, RemotingException, InterruptedException {
DefaultMQProducer defaultMQProducer = new DefaultMQProducer("ordinary_group");
//指定namesrv地址
defaultMQProducer.setNamesrvAddr(NAMESRV_ADDR);
//指定超时时间
defaultMQProducer.setSendMsgTimeout(5000);
//指定该主题的queue的个数
defaultMQProducer.setDefaultTopicQueueNums(2);
defaultMQProducer.start();
// for (int i = 0; i < 100; i++) {
Message msg = new Message("OrdinaryTopic_4", "ordA", ("你好我的世界" + 1).getBytes(RemotingHelper.DEFAULT_CHARSET));
SendResult sendResult = defaultMQProducer.send(msg);
log.info("{} %n", sendResult);
// }
defaultMQProducer.shutdown();
}
导致原因
Consumer刷新路由的时间为30S,没三十秒去Nameserver刷新路由,假设Broker集群为两台,发送一条消息,此时只会向其中一个Broker One中创建Topic,不会向第二台Broker Two中发送消息,也就不会创建Topic,此时Consumer重新刷新路由, 就会把Broker One中的路由信息保存,此时的Consumer就永远只会向Broker One中的发送消息,因为只有Broker One有对应的路由信息,Broker Two就永远不会创建路由信息
解决办法
手动创建队列
Spring Boot+RocketMQ集群创建队列问题解析
集成RocketMQ后,仅在一个Broker创建队列。需发送特定数量的消息来触发集群中其他Broker的队列创建。问题源于Consumer刷新路由的30S周期。解决方案包括手动创建队列或调整发送消息策略。

138

被折叠的 条评论
为什么被折叠?



