卡夫卡重置分区是否重新使用

时间:2018-11-12 17:24:11

标签: apache-kafka kafka-consumer-api

如果我从主题中消费并自己管理偏移量,则我处理的某些记录是成功的,然后我将偏移量向前移动,但是偶尔我会处理会引发异常的记录。我仍然需要向前移动偏移量。但是稍后,我将需要重置偏移量并重新处理失败的记录。提前偏移量时是否有可能设置一个标志,说如果我在该事件上的消费者再次忽略或消费,则可能吗?

2 个答案:

答案 0 :(得分:2)

处理这些记录的最佳方法不是通过重置偏移量,而是使用dead-letter queue,实质上是将它们发布到另一个kafka主题以供以后处理。这样,您的主要使用者可以专注于处理不引发异常的记录,而其他一些使用者可以不断地监听并尝试处理引发错误的记录。

如果第二个使用者仍在尝试重新处理消息时仍引发异常,则可以选择将它们重新发布到同一队列中,如果异常是由暂时性问题(系统暂时不可用,数据库问题,网络故障,等等),或者只是选择记录消息ID和内容,以及关于问题出在哪里的最佳猜测,以便以后手动查看。

答案 1 :(得分:1)

实际上-不,这是不可能的。 Kafka记录是只读的。我已经在实践中看到了这个用例,我将尝试为您提供一些建议:

  • 如果遇到错误,只需将消息复制到一个单独的错误主题中,然后继续。这样,您可以随时从错误主题中重播所有错误消息。那绝对是我首选的解决方案-灵活而高效。
  • 发生错误时-挂起您的消费者-最好进入一个无限循环,该循环具有指数补偿,一遍又一遍地重新读取同一条消息。我们将此策略与良好的监视/警报和日志压缩一起使用。当出现问题时,我们将修复损坏的使用者并重新部署我们的服务,或者如果消息本身已损坏,则生产者将修复其错误,使用相同的密钥重新发布该消息,然后开始压缩日志。有故障的消息将被删除(日志压实)。此时,我们将能够使我们的消费者前进。在大多数情况下,这需要手动交互。如果故障原因是网络问题(例如数据库关闭),则消费者可以自行恢复。
  • 使用本地存储设备(例如数据库)存储哪些偏移量失败。然后重置偏移量并忽略成功处理的记录。这是我最不喜欢的解决方案。