在 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。
让我们假设一个像这样的简单案例:
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。