kafka从0.8升级到kafka2.x后所有客户端代码也需要全部升级。kafka消费程序使用2.x java api重写后发现出现重复消费数据的情况。代码参照官方demo写的如下:
consumer.subscribe(Collections.singletonList(this.topic));
while(true){
ConsumerRecords<Integer, String> records = consumer.poll(Duration.ofSeconds(1));
for (ConsumerRecord<Integer, String> record : records) {
System.out.println("Received message: (" + record.key() + ", " + record.value() + ") at offset " + record.offset());
业务处理
}
}
出现如下日志:
在2.x api中使用poll 不断的轮询获取数据,就涉及到max.poll.interval.ms参数,其意思是每一轮调用poll之间的空闲时间,如果超过这个空闲时间则认为kafka消费者已死,重新平衡,将分区重新分配给其它成员。这个时间默认300000ms。业务处理逻辑时间过长就会出现这种问题。
解决方法:
1. 增加 max.poll.interval.ms 时间
2. 减少max.poll.records,每次获取的最大记录数
3. 业务处理尽量减少时间
4. 手动提交offset,处理一条提交一次