为什么Kafka0.9同一消费组内多个消费者会消费到相同消息
问题根因
- 手动指定分区绑定绕过了消费组分区分配规则:
@KafkaListener注解中使用@TopicPartition硬编码指定两个同消费组的消费者都绑定aaa主题的0分区,Kafka消费组默认「同组内同一个分区仅分配给一个消费者」的规则仅在消费组自动分配分区的场景下生效,手动绑定分区时消费组不会做分配校验,多个消费者同时拉取同一个分区的消息,自然会拿到完全相同的内容和offset。 - 未执行offset提交逻辑:你配置了
enable-auto-commit=false且ack模式为manual_immediate,要求消费完成后手动提交offset,但消费者代码中没有任何提交offset的逻辑,即使后续修复了分区绑定问题,也会因为offset一直未更新,每次拉取都从初始位置开始拉取,持续出现重复消费。
解决方案
- 优先选择消费组自动分配分区:移除两个
@KafkaListener中的topicPartitions配置,仅配置topics = "aaa"即可,消费组会自动将0分区分配给其中一个消费者,避免同分区被多个消费者消费。如果需要提升消费并行度,可以先给aaa主题增加分区数量,保证分区数≥同组消费者数量即可。 - 若必须手动指定分区:调整两个消费者的绑定分区,比如一个绑定分区0,另一个绑定分区1,避免同个分区被多个同组消费者绑定。
- 补充offset提交逻辑:在消费者方法入参中增加
Acknowledgment ack,业务逻辑执行完成后调用ack.acknowledge()手动提交offset,参考代码如下:
@KafkaListener(topics = "aaa", group = "home") public void doConsume(ConsumerRecord a, Acknowledgment ack){ log.info("000000 received kafka message:{},offset={}",a.value(),a.offset()); // 业务逻辑处理完成后提交offset ack.acknowledge(); }
内容的提问来源于stack exchange,提问作者heisenberg0203
相关产品推荐
相关产品推荐

