我们正在尝试使用Kafka Streams实现重复数据删除服务。 大图是它将使用其rocksDB状态存储来在处理过程中检查现有密钥。
如果我错了,请纠正我,但是为了使这些stateStores也容错,Kafka Streams API将透明地复制Kafka主题内的stateStore中的值(称为更改日志)。 这样,如果我们的服务失败了,另一个服务将能够根据在Kafka中找到的changeLog重建其stateStore。
但是这引起了我的疑问,这个“ StateStore-> changelog”本身是否只是一次? 我的意思是,当服务将更新其stateStore时,它也将以完全一次的方式更新changelog。 如果服务崩溃,那么另一项将承担负载,但是我们可以确定它不会丢失崩溃服务中的stateStore更新吗?
此致
Yannick
答案 0 :(得分:0)
答案是肯定的。
使用事务-原子多分区写入-Kafka Streams确保在执行偏移提交时,状态存储也被刷新到代理上的changelog主题。上述操作是原子操作,因此如果其中之一失败,应用程序将从前一个偏移位置重新处理消息。
您可以在下面的博客中详细了解一次语义https://www.confluent.io/blog/enabling-exactly-kafka-streams/。有以下部分: How Kafka Streams Guarantees Exactly-Once Processing
。
答案 1 :(得分:0)
但这引起了我的疑问,这个“ StateStore-> changelog”本身恰好是一次吗?
是的-正如其他人在这里所说的。当然,您必须通过配置参数processing.guarantee
将应用程序配置为使用完全一次语义,请参见https://kafka.apache.org/21/documentation/streams/developer-guide/config-streams.html#processing-guarantee(此链接适用于Apache Kafka 2.1)。
我们正在尝试使用Kafka Streams实现重复数据删除服务。大图是它将使用其rocksDB状态存储来在处理过程中检查现有密钥。
https://github.com/confluentinc/kafka-streams-examples/blob/5.1.0-post/src/test/java/io/confluent/examples/streams/EventDeduplicationLambdaIntegrationTest.java上还有一个事件重复数据删除示例应用程序。该链接指向Confluent Platform 5.1.0的repo分支,该分支使用Apache Kafka 2.1.0 =当前可用的最新版本的Kafka。