即使没有提交偏移量,Consumer.poll()也会返回新记录?

时间:2017-04-19 17:18:33

标签: apache-kafka kafka-consumer-api

如果我有一个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. 
                **/
            }

        }
    }
}

2 个答案:

答案 0 :(得分:5)

投票的起始偏移量不是由经纪人决定的,而是由消费者决定的。消费者跟踪最后收到的偏移量,并在下次调查期间询问以下一堆消息。

当消费者停止或失败时,偏移提交开始起作用,另一个不知道上次消耗的偏移的实例会占用分区的消耗。

KafkaConsumer有相当广泛的Javadoc非常值得一读。

答案 1 :(得分:1)

如果重新平衡,消费者将从上次提交偏移中读取(意味着如果有任何消费者离开该组或添加了新消费者),因此重复数据删除不会直接在kafka中进行,因此您必须将最后一个过程偏移存储在外部商店,并且在发生重新平衡或应用重新启动时,您应寻求该偏移量并开始处理,或者应对照DB检查消息中的某些唯一键以查找重复