Spring @Kafkalistener自动提交偏移量或手动:建议使用哪一种?

时间:2020-09-25 08:18:15

标签: spring-boot apache-kafka spring-kafka

根据我在网上阅读的内容,默认情况下,使用Spring @KafkaListener注释的方法将在5秒内提交偏移量。 假设5秒钟后,提交了偏移量,但是由于某些问题,处理仍在进行中,并且在使用者崩溃之间,在这种情况下,重新平衡后,该分区将分配给其他使用者,并且它将从下一条消息开始处理,因为上一个消息偏移量已提交。 这将导致邮件丢失。

那么,我需要在处理完成后手动提交偏移量吗?推荐的方法是什么?

同样,如果处理完成,并且在提交之前,使用者崩溃了,那么如何避免该消息 在这种情况下重复。

请提出避免消息丢失和重复的方法。我正在使用Spring KafkaListener 使用默认配置。

2 个答案:

答案 0 :(得分:1)

通常,这取决于您的用例以及您在处理过程中希望如何处理问题。自动提交的用法将更改应用程序的交付语义。

启用自动提交更像是“最多一次”的语义,因为您将在实际处理数据之前先读取并提交数据。如果您的处理失败,则该消息已被提交,并且您将不再阅读它,因此对于您的应用程序来说是“丢失”的(对于您的特定ConsumerGroup而言更为准确)。

禁用自动提交更像是“至少一次”语义,因为仅在处理数据之后才提交数据。假设您从该主题获取100条消息。其中有50个已成功处理成功,并且在处理第51条消息期间您的应用程序失败。现在,由于您禁用了自动提交,并且在处理结束时仅提交了全部或全部消息,因此您没有提交100条消息中的任何一条,下次您的应用程序再次读取相同的100条消息时。但是,您现在已经创建了50条重复的消息,因为它们先前已经被成功处理。

最后,您需要确定用例是否可以处理数据丢失或处理重复项。如果您的应用程序是幂等的,则可以确保处理重复项。

您正在询问“如何防止数据丢失和重复”,这意味着您是在指“完全一次的示意”。这是分布式流系统中的一个大话题,您可以检查spring-kafka文档,是否在哪种配置下受支持,并且取决于应用程序的输出操作。

还请检查GaryRussell对post的评论:

“ Spring团队不建议使用自动提交;侦听器容器Ackmode(BATCH或RECORD)将以确定性的方式提交偏移量;框架的最新版本会禁用自动提交(除非特别启用)”

答案 1 :(得分:0)

  1. 如果使用者需要5秒钟以上的时间来处理消息,则您的代码有问题,需要修复。
  2. 自动提交在生产中存在风险,因为这可能导致出现问题情况(消息丢失等)
  3. 最好采用手动提交,以实现更好的控制。
  4. 使使用者成为幂等,以使重复的消息和使用者的WIP状态不成问题。可能是,维护使用者数据库中的处理状态,以便如果处理完成一半,那么在使用者重新启动时,它可以清除WIP状态并重新进行处理。同样,如果处理状态为“完成”状态,则在重新启动时将看到“完成”状态,只需将重复的消息提交给Kafka。