试图了解(对于kafka来说是新的)kafka中的轮询事件循环如何工作。
用例:关于该主题的25条记录,最大民意调查大小设置为5。
max.poll.interval.ms = 5000 //5 seconds by default
max.poll.records = 5
任务顺序
我们基本上期望的是,循环将中断,并且偏移量将持续到成功处理消息逻辑被提交为止,然后下一次轮询将从失败的消息继续进行。
例如,第一批民意调查5条消息被轮询,并且1,2个偏移量成功提交,然后第三次失败,因此,如果我们预期之间有任何错误,则民意调查呼叫将继续移至下一批,如5-10,10-15它停止在该点,并且在第一种情况下轮询应从3开始,或者如果第二批在8处失败,则下一个轮询应从第8个偏移开始,而不是下一个最大轮询批处理设置(在这种情况下为5)。使用SPRING BOOT PROJECT并启用自动提交功能是错误的。
我尝试在文档中找到此内容,但没有帮助。
尝试对此进行了调整,但没有帮助max.poll.interval.ms
答案 0 :(得分:0)
max.poll.interval.ms
是毫秒,而不是秒,因此应为5000。
一旦轮询已返回记录(且未提交偏移量),除非重新启动使用者或对使用者执行seek()
操作以将偏移量重置为未处理的记录,否则不会再次返回记录
Spring for Apache Kafka项目提供了SeekToCurrentErrorHandler
来为您执行此任务。
如果您自己使用消费者(听起来很像),则必须进行搜索。
答案 1 :(得分:0)
在发生故障时,您可以手动搜索所有分配的分区的轮询开始偏移。我不确定使用spring消费者。
示例代码,用于查找普通使用者的起始偏移量。 在下面的代码中,我将获取每个分区的记录列表,然后获取要查找的第一条记录的偏移量。
def seekBack(records: ConsumerRecords[String, String]) = {
records.partitions().map(partition => {
val partitionedRecords = records.records(partition)
val offset = partitionedRecords.get(0).offset()
consumer.seek(partition, offset)
})
}
在生产环境中执行此操作的一个问题很糟糕,因为您不希望总是在出现短暂错误的情况下一直进行查找,否则最终将无限重试。