Spring Boot+RocketMQ集群只会在一个Broker中创建队列

集成RocketMQ后,仅在一个Broker创建队列。需发送特定数量的消息来触发集群中其他Broker的队列创建。问题源于Consumer刷新路由的30S周期。解决方案包括手动创建队列或调整发送消息策略。

问题:

在使用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就永远不会创建路由信息

解决办法

手动创建队列

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值