我试图了解 Kafka 流处理器 API 中的 RocksDB 行为。我正在使用 KStreams 提供的默认 RocksDB 配置一个持久的 StateStore。
StoreBuilder countStoreBuilder =
Stores.keyValueStoreBuilder(
Stores.persistentKeyValueStore("Counts"),
Serdes.String(),
Serdes.Long())
Run Code Online (Sandbox Code Playgroud)
我没有做任何聚合、连接或窗口化。我只是接收记录并将其中一些与商店中以前的物品进行比较,并将我收到的一些记录存储在州商店中。
开发人员指南提到您可以通过调用.withCachingEnabled()上述构建器在处理器 API 中启用记录缓存。
缓存“用作读取缓存以加快从状态存储中读取数据的速度” - Record Caches Kafka Streams
然而,我的理解是持久模式下的 RocksDB 首先缓冲在内存中,只有当状态不适合 RAM 时才会扩展到磁盘。
RocksDB 仅用作内部查找表(如果状态不适合内存,则可以刷新到磁盘。RocksDB 刷新仅是因为状态可能大于可用的主内存。Kafka Streams 内部数据管理
那么,如果记录缓存都缓存在内存中,那么记录缓存如何加快从状态存储中读取的速度呢?在我看来,记录缓存与 RocksDB 行为重叠。