You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kafka同一消费组内消费者重复消费消息的原因排查

Kafka同组消费者重复消费同一分区的问题

问题场景与代码

有一个包含7个分区的Kafka Topic,为每个分区配置了专属的独立消费者,核心代码如下:

String groupID = "topic_"+partitionID;

Properties props = new Properties();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,BOOTSTRAP_SERVERS);
props.put(ConsumerConfig.GROUP_ID_CONFIG,groupID);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, IntegerDeserializer.class.getName());
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class.getName());
props.put(JsonDeserializer.TRUSTED_PACKAGES,"*");

props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, true);
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest");

KafkaConsumer<Integer,Student> consumer = new KafkaConsumer<>(props);
TopicPartition topicPartition = new TopicPartition("request_topic",partitionID);

consumer.assign(Collections.singletonList(topicPartition));

单个应用实例运行时,每个分区仅有一个消费者监听;启动第二个实例后,同一分区会出现同属一个消费组(比如分区0对应topic_0组)的多个消费者,且这些消费者都会消费同一条消息,不符合Kafka同一消费组内分区不重复分配的规则。

问题原因

问题核心在于你使用了consumer.assign()手动指定分区,绕过了Kafka消费组的协调机制:

  • Kafka的消费组分区独占规则,仅在使用subscribe()方法订阅主题或分区时生效。此时Kafka的协调器会维护消费组与分区的映射关系,确保同一个消费组内,一个分区只会分配给一个消费者。
  • 当调用assign()手动绑定分区时,消费者直接跳过了消费组的协调逻辑,独立与目标分区建立连接。不管是否属于同一消费组,所有通过assign()绑定该分区的消费者,都会各自拉取分区内的消息,消费组的管控规则完全失效。
  • 再加上你为每个分区单独设置消费组的设计,一旦启动多个实例,同一个消费组下就会有多个消费者都用assign()绑定了同一分区,自然就会出现重复消费的情况。

解决方向

  • 若要利用消费组的分区独占特性,放弃使用assign(),改用subscribe()订阅主题,让Kafka协调器自动为消费组内的消费者分配分区。
  • 若必须手动指定分区,需自行控制每个消费组下只有一个消费者实例绑定目标分区,比如通过配置限定实例数量,或通过分片逻辑让每个实例仅处理指定的分区。

内容的提问来源于stack exchange,提问作者Glitch07

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 03:45:04