Kafka重置分区是否重新消耗

bkhjykvo  于 2021-06-06  发布在  Kafka
关注(0)|答案(2)|浏览(581)

如果我从我的主题中消费并自己管理偏移量,那么我处理的一些记录是成功的,然后我将偏移量移动到wards上,但有时我处理会引发异常的记录。我还需要把偏移量往前移。但在稍后的时候,我需要重置偏移量并重新处理失败的记录。是否可以在推进偏移量时设置一个标志,表示如果我再次忽略或消费该事件?

6ie5vjzr

6ie5vjzr1#

事实上-不,这是不可能的。Kafka的记录是只读的。我已经在实践中看到了这个用例,我将尝试给您一些建议:
如果遇到错误,只需将消息复制到单独的错误主题中,然后继续。这将允许您随时重播错误主题中的所有错误消息。这绝对是我的首选解决方案-灵活和性能。
当出现错误时-挂起你的消费者-最好进入一个无限循环,以指数回退反复阅读同一条消息。我们将此策略与良好的监视/警报和日志压缩结合使用。当出现问题时,我们要么修复损坏的使用者并重新部署我们的服务,要么如果消息本身已损坏,生产者将修复其错误,使用相同的密钥重新发布消息,日志压缩将启动。错误消息将被删除(日志压缩)。我们将能够推动我们的消费者在这一点上前进。在大多数情况下,这需要手动交互。如果故障原因是网络问题(例如数据库关闭),则使用者可以自行恢复。
使用本地存储(例如数据库)来存储失败的偏移量。然后重置偏移量并忽略成功处理的记录。这是我最不喜欢的解决方案。

eqqqjvef

eqqqjvef2#

处理这些记录的最佳方法不是重置偏移量,而是使用死信队列,本质上是将它们发布到另一个kafka主题以便稍后重新处理。这样,您的主要消费者可以集中精力处理不抛出异常的记录,而其他一些消费者可以不断地监听并尝试处理抛出错误的记录。
如果第二个使用者在尝试重新处理消息时仍引发异常,您可以选择将它们重新发布到同一队列(如果异常是由暂时性问题(系统暂时不可用、数据库问题、网络漏洞等)引起的),或者只选择记录消息id和内容,以及对问题所在的最佳猜测,供以后手动查看。

相关问题