卡夫卡消费者在重启时会消耗旧消息

时间:2020-07-20 09:12:50

标签: apache-kafka confluent-platform consumer

我正在使用某个主题的Kafka消息,但是问题是,每次使用者重新启动时,它都会读取较旧的已处理消息。

我用过auto.offset.reset=earliest。使用commit async手动设置它可以帮助我解决此问题吗?

我看到默认情况下,Kafka已经启用了对true的自动提交。

1 个答案:

答案 0 :(得分:1)

我用过auto.offset.reset=earliest。会手动设置 使用commit async可以帮助我克服这个问题吗?

设置了auto.offset.reset=earliest后,消费者将从可用的最早偏移量中读取,而不是从最后一个偏移量中读取。因此,第一次,您将使用新的group.id启动流程并将其设置为earliest,它将从起始偏移量开始读取。

这是我们可以调试问题的方式。

如果您的使用者group.id在每次重新启动时都相同,则需要检查提交是否确实在进行。

  1. 交叉检查是否要在任何地方手动将enable.auto.commit覆盖为false
  2. 接下来,检查默认情况下为auto.commit.interval.ms的自动提交间隔(5 sec),看看是否已将其更改为更高的值,并且在触发提交之前要重新启动进程。
  3. 您还可以使用commitAsync()甚至commitSync()手动触发。使用commitSync()(阻塞调用)测试提交时是否有任何异常。提交期间很少可能的错误是(来自docs

CommitFailedException-尝试提交分区时 不再分配给此消费者的原因是,消费者 例如不再是该组的一部分

RebalanceInProgressException-如果使用者实例位于 重新平衡的中间,因此尚未确定哪个分区 将分配给消费者。

TimeoutException-如果超时指定为 default.api.timeout.ms在成功完成 补偿提交

除此之外。

  1. 还要检查您是否在任何地方的消费者代码中执行seek()seekToBeginning()。如果您这样做并致电poll(),则可能还会收到较旧的消息。
  2. 如果您正在使用Embedded Kafka并进行一些测试,则每次重新启动测试时,都可能会从头开始阅读,从而创建主题和使用者组。检查是否为相似案例。

如果不查看代码,很难确定错误的确切原因。该答案仅提供有关调试方案的见识。