在 Kafka Streams 中使用至少一次交付时,流处理是原子的/事务性的吗?

Is stream processing atomic / transactional when using at least once delivery in Kafka Streams?

让我们假设一个像这样的简单案例:

ORDER_TOPIC ----> KSTREAM ----> VALIDATED_ORDER_TOPIC
                     |
          ROCKSDB LOCAL STATE STORE

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

现在有一个新订单到达,它没有被复制,所以它存储在本地商店中,但在将它发送到 VALIDATED_ORDER_TOPIC 之前,应用程序崩溃了。

我想知道 KStream 中的事务保证是什么:记录是否已存储并提交到本地状态存储或回滚?

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

如果您 运行 具有 at-least-once 语义,则没有交易保证。对于这种情况,如果您首先将ID添加到存储中,但在将记录写入输出主题之前崩溃,则可能会在从输入主题重新处理时丢失此记录。

如果你想de-duplicate,你需要启用processing.guarantees=exactly_once。对于这种情况,如果崩溃,存储将 "rolled back" 变为一致状态。即,崩溃后,只有写入输出主题成功后,它才会包含 ID。