消息分发模式(集群 or 广播)
集群(默认),消息被任一消费者消费即可,消费失败会进行消费重试
广播,Broker 把消息推送给所有订阅了 Topic 的消费者组,如果消费者组是多个,那么消息就会被多次消费,但是消费失败就失败了,不会进行消费重试
两个消费者组 每个组里边两个消费者 订阅了同一个topic。 现在来一条消息 这条消息被消费几次
RocketMQ 的消息消费模式分为 集群模式(Cluster) 和 广播模式(Broadcast),两者的核心区别在于 消息在消费者组内的分配方式 和 适用场景。以下是详细对比和说明:
一、集群模式(Cluster)
工作特点
- 消息分配
- 同一条消息只会被同一个消费者组中的一个消费者消费(但是多个组可以订阅相同的 Topic,这样一条消息就是多个消费者消费了)
- 通过负载均衡策略(如平均分配、一致性哈希等)分配消息队列给消费者
- 消费者和队列是一一对应的,如果消费者数量大于队列数量,就会有消费者永不处理消息
- 偏移量管理
- 消费进度(Offset)由 Broker 集中管理,保存在
${ROCKETMQ_HOME}/store/config/consumerOffset.json中 - 消费者定期提交 Offset 到 Broker
- RocketMQ 的控制台界面中,队列的 【最大位点】 - 【最小位点】 = 【差值】,【差值】就是还未消费的消息
- 消费进度(Offset)由 Broker 集中管理,保存在
配置方式
// 消费者设置集群模式
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)
工作特点
-
没有重试机制,即使消费者返回
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; // 注意:广播模式下此返回值无效! } }); -
消息分配
- 同一条消息会被 同一个消费者组中的所有消费者 消费
- 可以这样理解(虽然这样可能会误导,但易理解,结果也确实这样):Broker 把 Topic 的消息推送给消费者组,这个组下的每个消费者都要消费
-
偏移量管理
- 消费进度由 每个消费者本地维护(默认存储在客户端本地文件中)
- 就不是 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 集中管理 | 消费者本地维护 |
| 负载均衡 | 支持(自动分配队列) | 不支持(所有消费者消费全量消息) |
| 重复消费风险 | 无(天然去重) | 需业务层自行去重(如幂等设计) |
| 扩展性 | 高(动态增减消费者) | 低(每个消费者需处理全量数据) |
| 典型场景 | 订单处理、秒杀业务 | 配置推送、日志分发 |

浙公网安备 33010602011771号