卡夫卡流状态存储容错能力仅一次?

时间:2019-02-08 12:03:48

标签: apache-kafka apache-kafka-streams fault-tolerance

我们正在尝试使用Kafka Streams实现重复数据删除服务。 大图是它将使用其rocksDB状态存储来在处理过程中检查现有密钥。

如果我错了,请纠正我,但是为了使这些stateStores也容错,Kafka Streams API将透明地复制Kafka主题内的stateStore中的值(称为更改日志)。 这样,如果我们的服务失败了,另一个服务将能够根据在Kafka中找到的changeLog重建其stateStore。

但是这引起了我的疑问,这个“ StateStore-> changelog”本身是否只是一次? 我的意思是,当服务将更新其stateStore时,它也将以完全一次的方式更新changelog。 如果服务崩溃,那么另一项将承担负载,但是我们可以确定它不会丢失崩溃服务中的stateStore更新吗?

此致

Yannick

2 个答案:

答案 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。