我正在尝试确定是否需要使用KafkaConsumer.commitSync(Map offsets)打开手动提交
当我使用记录时,我需要确保它们能被我的服务处理,但我无法承担失去这些记录的负担,但是如果我的服务抛出了很多错误或崩溃,我不希望继续使用偏移量我知道它们已经被处理。
commitSync看起来像我需要调用的方法吗?
如果我不使用commitSync而是使用自动偏移量提交,当尝试处理一些Kafka事件时服务崩溃时,我是否有可能丢失事件。换句话说,在使用自动偏移提交时,在什么时候提交偏移?
答案 0 :(得分:4)
如果您不使用KafkaConsumer::commitSync
而是选择了自动提交机制,则不会丢失任何消息,但是可以多次处理同一条消息,例如,如果您处理消息并保存结果到某个地方并且您的应用程序崩溃(在保存偏移量之前,将自动提交),重新启动之后,您的应用程序将从上次提交的偏移量开始处理,并且可能导致同一条消息将被重新处理几次。
如果您使用KafkaConsumer::commitSync
,也会发生相同的情况,但是在这种情况下,手动管理提交可以在处理每条消息之后进行提交,最多只能重新处理一条消息。缺点是吞吐量较低。
答案 1 :(得分:1)
我同意@wardziniak的回答。因此,我认为,这完全取决于用例-流中包含的消息类型以及对消息的反应方式。
例如,在CQRS系统中,处理命令将需要同步提交,而将数据写入RDBMS投影可能会与异步提交一起正常工作。