如果微服务在kafka提交之前崩溃,那么kafka消息会发生什么



我是卡夫卡的新手。我有一个使用java微服务的Kafka Stream,它使用生产者和进程生成的Kafka-toic中的消息。kafka提交间隔已使用auto.commit.interval.ms设置。我的问题是,在提交之前,如果微服务崩溃,已经处理但没有提交的消息会发生什么?会有重复的记录吗?如果发生这种重复,如何解决?

Kafka具有恰好一次语义,它保证记录只处理一次。查看Spring Kafka文档的这一部分,了解有关Spring对此支持的更多详细信息。另外,请参阅本节以了解对事务的支持。

Kafka提供了各种交付语义。这些交付语义可以根据您已经实现的用例来决定。

如果您担心您的消息不应该被消费者服务丢失,那么您应该继续使用at-lease once传递语义。

现在根据at-least once交付语义回答您的问题:

  1. 如果您的消费者服务在提交Kafka消息之前崩溃,那么一旦您的消费者服务器启动并运行,它就会重新流式传输消息。这是因为没有提交分区的偏移量。一旦使用者处理了消息,就会提交分区的偏移量。简单地说,它表示偏移量已被处理,Kafka不会为同一分区发送提交的消息。

  2. at-least once交付语义通常足够好,适用于数据重复不是大问题或重复数据消除在消费者端是可能的用例。例如,如果每条消息中都有一个唯一的密钥,则在向数据库写入重复数据时,可以拒绝一条消息。

主要有三种类型的交付语义,

最多一次-消费者收到消息后,立即提交偏移。这有点冒险,因为如果处理出错,消息就会丢失。

至少一次-偏移在消息处理后提交,因此通常是首选偏移。如果处理出错,消息将被再次读取,因为它尚未提交。这个问题是消息的重复处理,所以请确保您的处理是幂等的。(是的,您的应用程序应该处理重复项,Kafka对此没有帮助(意味着在再次处理的情况下不会影响您的系统。

正好一次-可以使用kafka流API实现kafka到kafka通信。这不是你的情况。

您可以根据自己的需求从上面选择语义。

最新更新