【问题标题】:Kafka Streams stateStores fault tolerance exactly once?Kafka Streams stateStores 只容错一次?
【发布时间】:2019-07-02 16:12:55
【问题描述】:

我们正在尝试使用 Kafka Streams 实现重复数据删除服务。 大局是它将使用它的 RocksDB 状态存储,以便在处理过程中检查现有的密钥。

如果我错了,请纠正我,但为了使这些 stateStore 也具有容错性,Kafka 流 API 将透明地复制 Kafka 主题内 stateStore 中的值(称为更改日志)。 这样,如果我们的服务宕机,另一个服务将能够根据 Kafka 中的 changeLog 重建其 stateStore。

但它向我提出了一个问题,这个“StateStore --> changelog”本身是否恰好是一次? 我的意思是,当服务将更新其 stateStore 时,它​​也会以仅一次的方式更新更改日志.. ? 如果服务崩溃,另一个服务会承担负载,但我们能确定它不会错过崩溃服务的 stateStore 更新吗?

问候,

亚尼克

【问题讨论】:

  • 欢迎来到 Stack Overflow!请参阅:How do I do X? Stack Overflow 的期望是,提出问题的用户不仅会进行研究以回答他们自己的问题,还会分享研究、代码尝试和结果。这表明您已经花时间尝试帮助自己,它使我们免于重复明显的答案,最重要的是它可以帮助您获得更具体和相关的答案!另见:How to Ask
  • 我在 2018 年 Kafka 峰会上谈到了这个。您可以在 Kafka 峰会网页上找到幻灯片和录音:kafka-summit.org/sessions/…

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


【解决方案1】:

简短的回答是肯定的。

使用事务 - 原子多分区写入 - Kafka Streams 确保在执行偏移提交时,状态存储也会闪现到代理上的更改日志主题。以上操作是原子操作,因此如果其中一个操作失败,应用程序将从先前的偏移位置重新处理消息。

您可以在以下博客中阅读更多关于恰好一次语义https://www.confluent.io/blog/enabling-exactly-kafka-streams/ 的信息。有段:How Kafka Streams Guarantees Exactly-Once Processing

【讨论】:

【解决方案2】:

但它向我提出了一个问题,这个“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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 2018-11-14
    • 2018-07-08
    • 1970-01-01
    • 2019-03-30
    • 2020-04-25
    • 1970-01-01
    相关资源
    最近更新 更多