我们正在尝试使用 Kafka Streams 实现重复数据删除服务。 总体而言,它将使用其rocksDB状态存储来在处理过程中检查现有 key 。
如果我错了,请纠正我,但为了使这些 stateStore 也具有容错能力,Kafka Streams API 将透明地复制 Kafka 主题内 stateStore 中的值(称为更改日志)。 这样,如果我们的服务出现故障,另一个服务将能够根据 Kafka 中找到的 ChangeLog 重建其 stateStore。
但这向我提出了一个问题,这个“StateStore -->changelog”本身是否恰好是一次? 我的意思是,当服务更新其 stateStore 时,它也会以一次的方式更新变更日志..? 如果服务崩溃,另一个服务将承担负载,但我们能否确定它不会错过崩溃服务的 stateStore 更新?
问候,
雅尼克
最佳答案
简短的回答是肯定的。
使用事务 - 原子多分区写入 - Kafka Streams 确保,当执行偏移提交时,状态存储也会刷新到代理上的更改日志主题。上述操作是原子的,因此如果其中一个操作失败,应用程序将从先前的偏移位置重新处理消息。
您可以在以下博客中阅读有关恰好一次语义的更多信息 https://www.confluent.io/blog/enabling-exactly-kafka-streams/ 。有一节:Kafka Streams 如何保证 Exactly-Once 处理
。
关于apache-kafka - Kafka Streams stateStores 容错一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54592072/