消息分发模式(集群 or 广播)

集群(默认),消息被任一消费者消费即可,消费失败会进行消费重试
广播,Broker 把消息推送给所有订阅了 Topic 的消费者组,如果消费者组是多个,那么消息就会被多次消费,但是消费失败就失败了,不会进行消费重试

两个消费者组 每个组里边两个消费者 订阅了同一个topic。 现在来一条消息 这条消息被消费几次

RocketMQ 的消息消费模式分为 集群模式(Cluster)广播模式(Broadcast),两者的核心区别在于 消息在消费者组内的分配方式适用场景。以下是详细对比和说明:


一、集群模式(Cluster)

工作特点

  1. 消息分配
    • 同一条消息只会被同一个消费者组中的一个消费者消费(但是多个组可以订阅相同的 Topic,这样一条消息就是多个消费者消费了)
    • 通过负载均衡策略(如平均分配、一致性哈希等)分配消息队列给消费者
    • 消费者和队列是一一对应的,如果消费者数量大于队列数量,就会有消费者永不处理消息
  2. 偏移量管理
    • 消费进度(Offset)由 Broker 集中管理,保存在 ${ROCKETMQ_HOME}/store/config/consumerOffset.json
    • 消费者定期提交 Offset 到 Broker
    • RocketMQ 的控制台界面中,队列的 【最大位点】 - 【最小位点】 = 【差值】,【差值】就是还未消费的消息

配置方式

// 消费者设置集群模式
consumer.setMessageModel(MessageModel.CLUSTERING);

队列和消费者的关系

4队列2消费者

%% 图1:4队列2消费者(集群模式) flowchart LR subgraph Broker TopicA --> Queue0 TopicA --> Queue1 TopicA --> Queue2 TopicA --> Queue3 end Queue0 --> Consumer1 Queue1 --> Consumer1 Queue2 --> Consumer2 Queue3 --> Consumer2 subgraph ConsumerGroupA Consumer1 Consumer2 end

4队列3消费者

%% 图2:4队列3消费者(集群模式) flowchart LR subgraph Broker TopicA --> Queue0 TopicA --> Queue1 TopicA --> Queue2 TopicA --> Queue3 end Queue0 --> Consumer1 Queue1 --> Consumer2 Queue2 --> Consumer3 Queue3 --> Consumer1 subgraph ConsumerGroupA Consumer1 Consumer2 Consumer3 end

4队列5消费者

%% 图3:4队列5消费者(集群模式) flowchart LR subgraph Broker TopicA --> Queue0 TopicA --> Queue1 TopicA --> Queue2 TopicA --> Queue3 end Queue0 --> Consumer1 Queue1 --> Consumer2 Queue2 --> Consumer3 Queue3 --> Consumer4 subgraph ConsumerGroupA Consumer1 Consumer2 Consumer3 Consumer4 Consumer5[Consumer5(空闲)] end

二、广播模式(Broadcast)

工作特点

  1. 没有重试机制,即使消费者返回 ConsumeConcurrentlyStatus.RECONSUME_LATER 也不会重试,如果需要重试,需要自行本地实现

    // 消费者设置广播模式(无重试参数)
    DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group_name");
    consumer.setMessageModel(MessageModel.BROADCASTING); // 关键设置
    consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {
        try {
            // 业务处理(在业务方法中可以进行重试)
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        } catch (Exception e) {
          	// 或者在这里也可以进行重试
            return ConsumeConcurrentlyStatus.RECONSUME_LATER; // 注意:广播模式下此返回值无效!
        }
    });
    
  2. 消息分配

    • 同一条消息会被 同一个消费者组中的所有消费者 消费
    • 可以这样理解(虽然这样可能会误导,但易理解,结果也确实这样):Broker 把 Topic 的消息推送给消费者组,这个组下的每个消费者都要消费
  3. 偏移量管理

    • 消费进度由 每个消费者本地维护(默认存储在客户端本地文件中)
    • 就不是 Broker 维护了,所以控制台界面中可能出现:存在差值,但队列中没有未消费的消息

配置方式

// 消费者设置广播模式
consumer.setMessageModel(MessageModel.BROADCASTING);

队列和消费者的关系

%% 广播模式极简版:4队列2消费者 flowchart LR subgraph Broker集群 TopicA[TopicA] TopicA --> Queue0 TopicA --> Queue1 TopicA --> Queue2 TopicA --> Queue3 end subgraph 消费者组A Consumer1[[消费者1]] Consumer2[[消费者2]] end %% 队列直连消费者组(广播语义) Queue0 --> 消费者组A Queue1 --> 消费者组A Queue2 --> 消费者组A Queue3 --> 消费者组A

三、核心对比

特性 集群模式(Cluster) 广播模式(Broadcast)
消息分配 组内单消费者消费 组内所有消费者消费
Offset管理 Broker 集中管理 消费者本地维护
负载均衡 支持(自动分配队列) 不支持(所有消费者消费全量消息)
重复消费风险 无(天然去重) 需业务层自行去重(如幂等设计)
扩展性 高(动态增减消费者) 低(每个消费者需处理全量数据)
典型场景 订单处理、秒杀业务 配置推送、日志分发
posted @ 2025-07-04 17:46  CyrusHuang  阅读(127)  评论(0)    收藏  举报