apache-kafka - 在 Kafka Streams 中重建状态存储是否会将重复记录传播到下游主题?

标签 apache-kafka apache-kafka-streams restore stateful

我目前正在将 Kafka Streams 用于有状态应用程序。不过,状态存储在 Kafka 状态存储中,而只是暂时存储在内存中。这意味着每当我重新启动应用程序时,所有状态都会丢失,并且必须通过从头开始处理所有记录来重建它。

在对 Kafka 状态存储进行了一些研究之后,这似乎正是我正在寻找的在应用程序重启之间保持状态(在内存中或磁盘上)的解决方案。但是,我发现网上的资源缺少一些非常重要的细节,所以我仍然有几个关于它究竟如何工作的问题:

  • 如果流设置为从偏移量 latest 开始,是否仍会根据所有以前的记录(重新)计算状态?
  • 如果之前已经处理过的记录需要重新处理以重建状态,这是否会通过其余的 Streams 拓扑传播记录(例如 InputTopic -> stateful processor -> OutputTopic,这会导致 OutputTopic 中的重复记录吗因为重建状态)?

最佳答案

国有商店使用自己的changelog主题和 kafka-streams 状态存储负责从中加载。如果您的状态存储未初始化,您的 kafka-streams 应用程序将使用 EARLIEST 从变更日志主题中重新水合其本地状态存储。 ,因为它必须读取每条记录。

这意味着全新实例的启动顺序大致是:

  • 观察没有本地状态存储缓存
  • 通过使用状态存储的变更日志主题加载本地状态存储(状态存储的主题名称为 <state-store-name>-changelog )
  • 读取每条记录并相应地更新本地 rocksDB 实例
  • 不要发出任何东西,因为这是一个应用程序服务,而不是您的实际拓扑结构
  • 使用 EARLIEST 读取您的消费者群体偏移量或 LATEST根据您配置拓扑的方式。如果您的消费者群体还没有任何抵消,这不仅仅是一个问题
  • Process stuff,根据拓扑发出记录

您是否设置实际拓扑的 auto.offset.resetLATESTEARLIEST你决定。如果它们丢失了,或者您创建了一个新组,它会在可能跳过记录 (LATEST) 与处理旧记录和重复数据删除的重新处理 (EARLIEST) 之间取得平衡,

长话短说:状态恢复不同于处理,由 kafka-streams 自行处理。

关于apache-kafka - 在 Kafka Streams 中重建状态存储是否会将重复记录传播到下游主题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59716187/

相关文章:

java - 来自单个主主题的多个流

java - 在一段时间内使用 kafka-streams 处理和检查事件

export - 备份/恢复 Notes.app 中的笔记,即存储在 iCloud 中(iOS、Mac OS X Mountain Lion)

mysql - 从.MYD、.MYI和.frm文件恢复SQL表,mysql找不到.frm文件

apache-kafka - 具有 SASL 安全性的 Zookeeper 和 Kafka

apache-kafka - 更改 Kafka Streams 内部主题的复制因子会影响更改日志/重新分区主题名称中的数字吗?

apache-kafka - 消费者未收到消息,kafka 控制台,新的消费者 api,Kafka 0.9

java - 如何获取kafka的消费者offset值

java - 具有 Avro 记录的 Kafka Streams TopologyTestDriver 的架构注册问题

php - 通过 PHP 恢复特定表的 mysql 转储