KafkaConsumer poll()行为理解

时间:2019-09-30 14:19:42

标签: spring-boot apache-kafka kafka-consumer-api kafka-producer-api

试图了解(对于kafka来说是新的)kafka中的轮询事件循环如何工作。

用例:关于该主题的25条记录,最大民意调查大小设置为5。

max.poll.interval.ms = 5000 //5 seconds by default max.poll.records = 5

任务顺序

  1. 从主题中轮询记录。
  2. 在for循环中处理记录。
  3. 某些处理登录,逻辑将通过或失败。
  4. 如果逻辑通过(具有偏移量)将被添加到地图中。
  5. 然后将使用commitSync调用将其提交。
  6. 如果失败,则循环将中断,无论执行什么成功,都将提交。
  7. 下一次民意调查即使出现错误也只会以5批为单位进行移动,这是预期的吗?

我们基本上期望的是,循环将中断,并且偏移量将持续到成功处理消息逻辑被提交为止,然后下一次轮询将从失败的消息继续进行。

例如,第一批民意调查5条消息被轮询,并且1,2个偏移量成功提交,然后第三次失败,因此,如果我们预期之间有任何错误,则民意调查呼叫将继续移至下一批,如5-10,10-15它停止在该点,并且在第一种情况下轮询应从3开始,或者如果第二批在8处失败,则下一个轮询应从第8个偏移开始,而不是下一个最大轮询批处理设置(在这种情况下为5)。使用SPRING BOOT PROJECT并启用自动提交功能是错误的。

我尝试在文档中找到此内容,但没有帮助。

尝试对此进行了调整,但没有帮助max.poll.interval.ms

2 个答案:

答案 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)
    })
  }

在生产环境中执行此操作的一个问题很糟糕,因为您不希望总是在出现短暂错误的情况下一直进行查找,否则最终将无限重试。