一个主题只在一个 broker 创建的问题

1、遇到的问题:

在我们线上的 broker 集群中,有非常多 topic 只在某一个 broker 中创建, 经过调查,发现是因为 client 会每隔 30 秒(默认),调用 MQClientInstance.updateTopicRouteInfoFromNameServer() 的方法更新路由信息; 如果一个新的 topic 在 30 秒内只发送了一条消息(其实少于一个 broker 分 queueNum 时就可以),或者刚好在 30 秒最后的时候创建, 那么在执行定时任务 updateTopicRouteInfoFromNameServer() 后, topic 就只会在第一次发请求的 broker 上面创建了; 因为 client 再去 namesrv 获取路由信息时, 只能看到一个 broker 上面有 topic; (也就是说,新加的 broker 也不会为原有的 topic 分摊工作); 除非旧的存在 topic 的 broker 全部不存在,才会在新的 broker 上创建; 毕竟集群中,只有几个 broker 在运行绝大数 topic , 资源分配不均, 很令人难受

2、 如何操作:

1.开启两个 broker 集群; 2.修改 org.apache.rocketmq.example.quickstart.Producer 类 修改循环体内的方法

    for (int i = 0; i < 10; i++) {
        try {

            String newTopic = "TopicTest03"; // 每次测试请重新创建一个不存在的 Topic
            Message msg = new Message(newTopic /* Topic */,
                "TagA" /* Tag */,
                ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
            );

            SendResult sendResult = producer.send(msg);

            TopicPublishInfo info = producer.getDefaultMQProducerImpl().getTopicPublishInfoTable().get(newTopic);
            info.getMessageQueueList().stream()
                    .map(MessageQueue::getBrokerName)
                    .distinct().forEach(System.out::println); // 输出本次消息可发送的 brokerName

            // 注释下方方法, 输出 broker-a,broker-a;
            // 不注释下方方法.输出只 broker-a (第一次会输出两个,因为还没执行这个方法.但是它只在一个 broker 上创建了)
            producer.getDefaultMQProducerImpl().getmQClientFactory().updateTopicRouteInfoFromNameServer();


        } catch (Exception e) {
            e.printStackTrace();
            Thread.sleep(1000);
        }
    }

3、期待结果

每一个的 topic 可以在任何时候在任何 broker 中, 发送的数据可以存放在任何 broker 中; (可以设置一些规则,比如只在一个机房中), 新建的broker 也能为旧的 broker 上 topic 分担工作

新建的 topic 在某些情况下,只出现在一个 broker 中; broker 集群中新加的节点没有帮助旧的 broker 分摊工作;

Macbook pro 11.2.3 rocketMQ 4.8.1 jdk 1.8.0_211

感觉 copy store/config 可以解决一部分问题,,但是这个方法很不好; 或者使用rocketmq-console操作, 但是感觉这种问题还是代码上能解决最好;

原提问者GitHub用户zcsh0721

展开
收起
芬奇福贵 2023-05-26 11:08:54 119 分享 版权
1 条回答
写回答
取消 提交回答
  • 自动创建的时候是这样的,但是一般推荐关闭自动创建,推荐使用adminTools 创建,可以按照集群创建,也可以按照broker 为纬度创建。

    原回答者GitHub用户duhenglucky

    2023-05-26 17:24:22
    赞同 展开评论

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

还有其他疑问?
咨询AI助理