内存与持久性Kafka Streams状态存储

Dth*_*Dth 6 apache-kafka-streams

我已经阅读了有状态流处理概述,如果我理解正确,RocksDB被用作键值存储的默认实现的一个主要原因是事实,与内存集合不同,它可以处理数据大于可用内存,因为它可以刷新到磁盘.两种类型的存储都可以在应用程序重新启动后继续存在,因为数据将作为Kafka主题备份.

但还有其他差异吗?例如,我注意到我的持久状态存储为每个主题分区创建了一些.log文件,但它们都是空的.

简而言之,我想知道用内存中替换持久存储的性能优势和可能存在的风险是什么.

Jac*_*ski 6

我对 Kafka Streams 的内部结构和状态存储的不同用例的理解非常有限,尤其是。内存中 vs 持久化,但到目前为止我设法了解到,持久化状态存储是存储在磁盘上(因此名称为persistent)的StreamTask.

这并没有给出太多,因为内存中的名称和持久化的名称本身可能给出了相同的理解,但是当我了解到 Kafka Streams 尝试将分区分配给分配了分区的相同 Kafka Streams 实例时,我发现非常令人耳目一新之前(重新启动或崩溃)。

这就是说,在内存中的状态存储仅仅是重建(重播)每辆花费卡夫卡流应用程序之前的时间重新启动是启动和运行时的持久状态存储的东西已经物化磁盘和卡夫卡流实例具有唯一一次上重新创建状态存储要做的是从磁盘加载文件(而不是从需要更长时间的更改日志主题)。

我希望这会有所帮助,如果我错了(或部分正确),我很高兴得到纠正。

  • 好点子!我只想添加一个观察结果:持久状态存储在 .checkpoint 文件中保存偏移量,以标记变更日志主题的哪一部分位于 RocksDB 存储中。重新启动后,它将开始从该偏移量读取变更日志主题,如下所述:https://www.mail-archive.com/users@kafka.apache.org/msg26808.html 因此在某些情况下它必须做一些工作,不仅仅是从磁盘加载,但如果我的理解是正确的话,它仍然比内存存储少得多。 (2认同)