让我们假设一个简单的例子:
upper
KStream使用带有转换器的转换操作对来自ORDER_TOPIC的消息进行重复数据删除,该转换器将消息按其键/ ID存储在持久本地状态存储中。这样,如果相同的订单到达两次,它将被忽略。
现在收到一个新订单,它不会重复,因此存储在本地商店中,但是在将其发送到VALIDATED_ORDER_TOPIC之前,应用程序崩溃了。
我想知道KStream内部有哪些事务保证:记录是否已存储并提交到本地状态存储或回滚?
您能否指出一些有关具有至少一次语义的Kafka Streams的交易保证的文档?
答案 0 :(得分:1)
如果您至少使用一次语义来运行,则没有事务保证。在这种情况下,如果您首先将ID添加到存储中,但是在将记录写入输出主题之前崩溃,则在从输入主题重新处理记录时,可能会丢失该记录。
如果要删除重复项,则需要启用processing.guarantees=exactly_once
。对于这种情况,如果您崩溃了,商店将被“回滚”到一致状态。即,崩溃后,仅当成功写入输出主题时,它将包含ID。