微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

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

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

解决方法

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

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

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

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

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

还请检查GaryRussell对post的评论:

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。