在Kafka Streams中至少使用一次传递时,流处理是原子处理还是事务处理?

时间:2019-06-24 09:48:29

标签: apache-kafka apache-kafka-streams

让我们假设一个简单的例子:

upper

KStream使用带有转换器的转换操作对来自ORDER_TOPIC的消息进行重复数据删除,该转换器将消息按其键/ ID存储在持久本地状态存储中。这样,如果相同的订单到达两次,它将被忽略。

现在收到一个新订单,它不会重复,因此存储在本地商店中,但是在将其发送到VALIDATED_ORDER_TOPIC之前,应用程序崩溃了。

我想知道KStream内部有哪些事务保证:记录是否已存储并提交到本地状态存储或回滚?

您能否指出一些有关具有至少一次语义的Kafka Streams的交易保证的文档?

1 个答案:

答案 0 :(得分:1)

如果您至少使用一次语义来运行,则没有事务保证。在这种情况下,如果您首先将ID添加到存储中,但是在将记录写入输出主题之前崩溃,则在从输入主题重新处理记录时,可能会丢失该记录。

如果要删除重复项,则需要启用processing.guarantees=exactly_once。对于这种情况,如果您崩溃了,商店将被“回滚”到一致状态。即,崩溃后,仅当成功写入输出主题时,它将包含ID。