正常情况下
对应一个topic时,一个group中只有一个消费者能消费到某个Partition的数据,该partition只能被一个consumer消费。
但是在我一波操作下,被重复消费了。因为和消费者有关,所以只展示消费者。
两个消费者代码相同
@KafkaListener(groupId = "xgroup-1",topicPartitions = {@TopicPartition(topic = "test-topic-1", partitions = {"0"})})
public void processMessage(String content, ConsumerRecord<? , ?> record, Acknowledgment acknowledgment) {
Optional<?> kafkaMessage = Optional.ofNullable(record.value());
// 对象存在
if (kafkaMessage.isPresent()) {
System.out.println("线程 "+Thread.currentThread().getName()+" 1:test-topic-1 监听得到: "+content+" record.offset() = " + record.offset());
acknowledgment.acknowledge();
}
}
运行结果:可以发现重复消费了,同一个消费者组内的竟然对一个partition重复消费了
线程 org.springframework.kafka.KafkaListenerEndpointContainer#1-0-C-1 2 :test-topic-1 监听得到: {"id":1654938099313,"msg":null} record.offset() = 70
线程 org.springframework.kafka.KafkaListenerEndpointContainer#0-0-C-1 1:test-topic-1 监听得到: {"id":1654938099313,"msg":null} record.offset() = 70
####问题出现原因
因为我使用了下面的注解方式指定了partition所以导致了这个现象的发生,这破坏了kafka自带的rebalance机制,从而也导致出现了重复消费的问题。
@KafkaListener(groupId = "xgroup-1",topicPartitions = {@TopicPartition(topic = "test-topic-1", partitions = {"0"})})
####解决方法
不指定partition即可
//@KafkaListener(groupId = "xgroup-1",topics = "test-topic-1")