开发者社区 > 云原生 > 消息队列 > 正文

在RocketMQ中这些设置了messageGroup的一堆消息会路由到同一个吗?

在RocketMQ中关于顺序消息的生产和消费,版本5.0
设置了同一个messageGroup的一堆消息,假设有多个生产者,这些设置了messageGroup的一堆消息会路由到同一个messageQueue吗?

展开
收起
冲冲冲c 2024-07-01 22:39:52 22 0
2 条回答
写回答
取消 提交回答
  • 是的,你的理解适用于版本5.0及之后的RocketMQ。在5.0及之后的RocketMQ中,如果多个生产者发送的消息设置了相同的messageGroup,这些消息将会被路由到同一个messageQueue中,以此来保证消息的顺序性。确保相同messageGroup的消息能够按照先进先出的顺序进行处理。

    2024-07-02 09:26:55
    赞同 2 展开评论 打赏
  • 北京阿里云ACE会长

    RocketMQ 会根据 messageGroup 进行哈希,然后对队列数量进行取模运算,以决定消息应该发送到哪个队列。这样,相同 messageGroup 的消息会被分配到同一个队列。

    虽然 RocketMQ 支持消息顺序性,但在实际应用中,还需要考虑故障转移和容错机制,以确保系统的高可用性。

    DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name");
    producer.start();
    try {
        String[] tags = new String[] {"TagA", "TagB", "TagC", "TagD"};
        for (int i = 0; i < 100; i++) {
            int orderId = i % 10; // 模拟订单ID
            String messageGroup = "your_message_group_name"; // 指定 messageGroup
            String msgContent = "Hello RocketMQ " + (i + 1);
            Message msg = new Message("TopicTest", tags[i % tags.length], messageGroup, msgContent.getBytes(RemotingHelper.DEFAULT_CHARSET));
            SendResult sendResult = producer.send(msg, new MessageQueueSelector() {
                @Override
                public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
                    Integer id = (Integer) arg;
                    int index = id % mqs.size();
                    return mqs.get(index);
                }
            }, orderId);
            System.out.printf("%s%n", sendResult);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        producer.shutdown();
    }
    
    2024-07-02 08:45:42
    赞同 3 展开评论 打赏

多个子产品线联合打造金融级高可用消息服务以及对物联网的原生支持,覆盖多行业。

相关产品

  • 云消息队列 MQ
  • 相关电子书

    更多
    RocketMQ Client-GO 介绍 立即下载
    RocketMQ Prometheus Exporter 打造定制化 DevOps 平台 立即下载
    基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台 立即下载