should we ever invoke processorContext.commit()
in Processor
implementation by ourselves? I mean invoking commit
method inside scheduled Punctuator
implementation or inside process
method.
in which use cases should we do that, and do we need that at all? the question relates to both Kafka DSL with transform()
and Processor API.
seems Kafka Streams handles it by itself, also invoking processorContext.commit()
does not guarantee that it will be done immediately.
答案 0 :(得分:2)
从处理器或标点中调用commit()
是可以的,这就是提供此API的原因。
虽然Kafka Streams定期(可配置)提交提交,但您可以在使用它时请求中间提交。一个示例用例是,您通常执行廉价的计算,但是有时您执行一些昂贵的操作,并希望在此操作之后尽快提交,而不是等待下一个提交间隔(以减少在执行昂贵的操作后执行失败的可能性,并且下一个提交间隔)。另一个用例是,如果将提交间隔设置为MAX_VALUE
,则什么可以有效地“禁用”常规提交并根据您的业务逻辑决定何时提交。
我想,对于大多数用例而言,调用commit()
并不是必需的。
答案 1 :(得分:0)
对于用例,如果批处理大小达到一定数量(比如说10),我将以处理器处理方法批处理一定数量的记录,并将批处理的记录从处理功能写入File。
让我们说在提交发生之前的那一刻,我们向文件和系统崩溃写入了一批记录(因为我们无法调用显式提交)。下次流启动时,处理器将根据最后提交的偏移量处理记录。这意味着我们可能正在将一些重复的数据写入文件。无论如何要避免写入重复数据?