spring@kafkalistener自动提交偏移量还是手动提交:建议使用哪种方法?

lskq00tm  于 2021-06-04  发布在  Kafka
关注(0)|答案(2)|浏览(2233)

根据我在网上看到的,用spring@kafkalistener注解的方法将在默认情况下在5秒内提交偏移量。假设5秒后,偏移量已提交,但处理仍在进行,并且由于某些问题处于使用者崩溃之间,在这种情况下,重新平衡后,分区将被分配给其他使用者,它将从下一条消息开始处理,因为上一条消息偏移量已提交。这将导致消息丢失。
所以,我需要在处理完成后手动提交偏移量吗?建议的方法是什么?
同样,如果处理完成了,并且就在提交之前,使用者崩溃了,那么在这种情况下如何避免消息重复。
请提出避免信息丢失和重复的方法。我使用的是带有默认配置的SpringKafkalistener。

4zcjmb1e

4zcjmb1e1#

像往常一样,这取决于您的用例以及在处理过程中您希望如何处理问题。自动提交的使用将改变应用程序的交付语义。
启用自动提交更像是一种“最多一次”的语义,因为您将在实际处理数据之前读取并提交数据。如果您的处理失败,则消息已经提交,您将不会再读取它,因此您的应用程序将“丢失”它(更确切地说,您的特定consumergroup)。
禁用自动提交更像是一种“至少一次”的语义,因为只有在处理数据之后才提交数据。假设你从这个主题中收到100条消息。其中50封已成功处理,而您的应用程序在处理第51条消息时失败。现在,由于您禁用了自动提交,并且在处理结束时只提交全部或无消息,因此您还没有提交100条消息中的任何一条,下次应用程序再次读取相同的100条消息时。但是,您现在已经创建了50个重复的消息,因为它们以前已经成功处理过了。
总之,您需要弄清楚您的用例是否可以处理数据丢失或处理重复数据。如果应用程序是幂等的,则可以确保处理重复项。
您询问的是“如何防止数据丢失和重复”,这意味着您指的是“恰好一次scemantics”。这是分布式流媒体系统中的一个重要主题,如果支持,您可以查看springkafka文档,具体取决于应用程序的输出操作。
另外,请查看garyrussell对此帖子的评论:
spring团队不建议使用autocommit;侦听器容器ackmode(批处理或记录)将以确定的方式提交偏移量;框架的最新版本禁用自动提交(除非特别启用)

zrfyljdw

zrfyljdw2#

如果消费者需要5秒以上的时间来处理消息,那么您的代码中存在需要修复的问题。
自动提交在生产中是有风险的,因为它可能导致问题场景(消息丢失等)
最好使用手动提交以获得更好的控制。
使消费者幂等,这样消费者的重复消息和wip状态就不成问题。可以是,在使用者的数据库中保持处理状态,以便如果处理完成一半,则在使用者重新启动时,它可以清除wip状态并重新处理。类似地,如果处理状态是complete state,那么在重新启动时,它将看到complete状态,并将重复的消息提交给kafka。

相关问题