如果我有一个enable.auto.commit=false
并且我在没有致电consumer.poll()
之后致电consumer.commitAsync()
,为什么consumer.poll()
会返回
新记录下次被称为?
由于我没有提交偏移量,我希望poll()
会返回最新的偏移量,该偏移量应该是相同的记录。
我问,因为我在处理过程中试图处理故障情况。我希望不提交偏移量,poll()
将再次返回相同的记录,以便我可以再次重新处理这些失败的记录。
public class MyConsumer implements Runnable {
@Override
public void run() {
while (true) {
ConsumerRecords<String, LogLine> records = consumer.poll(Long.MAX_VALUE);
for (ConsumerRecord record : records) {
try {
//process record
consumer.commitAsync();
} catch (Exception e) {
}
/**
If exception happens above, I was expecting poll to return new records so I can re-process the record that caused the exception.
**/
}
}
}
}
答案 0 :(得分:5)
投票的起始偏移量不是由经纪人决定的,而是由消费者决定的。消费者跟踪最后收到的偏移量,并在下次调查期间询问以下一堆消息。
当消费者停止或失败时,偏移提交开始起作用,另一个不知道上次消耗的偏移的实例会占用分区的消耗。
KafkaConsumer有相当广泛的Javadoc非常值得一读。
答案 1 :(得分:1)
如果重新平衡,消费者将从上次提交偏移中读取(意味着如果有任何消费者离开该组或添加了新消费者),因此重复数据删除不会直接在kafka中进行,因此您必须将最后一个过程偏移存储在外部商店,并且在发生重新平衡或应用重新启动时,您应寻求该偏移量并开始处理,或者应对照DB检查消息中的某些唯一键以查找重复