Kafka Streams 中的内存中与持久状态存储?

In-memory vs persistent state stores in Kafka Streams?

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

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

简而言之,我想知道用内存中的存储替换持久存储有哪些性能优势和可能的风险。

我看不出有任何理由要更换当前的 RocksDB 存储。事实上 RocksDB 是最快的 k,v 存储之一: Percona benchmarks (based on RocksDB)

with in-memory ones - RocksDB 已经充当 in-memory 并涉及一些 LRU 算法:

RocksDB architecture

The three basic constructs of RocksDB are memtable, sstfile and logfile. The memtable is an in-memory data structure - new writes are inserted into the memtable and are optionally written to the logfile.

但是选择此实现还有一个更值得注意的原因:

RocksDB source code

如果您查看源代码比率 - C++ 代码中暴露了很多 Java api。因此,使用公开的 api.

将此产品集成到现有的 Java - based Kafka 生态系统中并全面控制存储要简单得多

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

这并没有像名字本身那样给出太多 in-memory vs persistent 可能给出了相同的理解,但我当我了解到 Kafka Streams 尝试将分区分配给之前分配过分区(重启或崩溃)的相同 Kafka Streams 实例时,我发现 令人耳目一新

就是说,每次重启都会简单地重新创建(重播)内存中的状态存储,这在 Kafka Streams 应用程序启动之前需要时间,而 运行 而持久状态存储已经在磁盘上 实现 并且 Kafka Streams 实例唯一需要做的就是重新创建状态存储是从磁盘加载文件(而不是从变更日志主题需要更长的时间)。

希望对您有所帮助,如果我错了(或部分正确),我很乐意得到纠正。