如果 RocksDB 缓存在内存中,为什么要在 Kafka Streams Processor API 中启用记录缓存?

iah*_*h10 5 apache-kafka rocksdb apache-kafka-streams

我试图了解 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 行为重叠。

Mat*_*Sax 5

您的观察是正确的,这取决于用例是否需要缓存。应用级缓存(而不是 RocksDB 缓存)的一大优势是它减少了写入更改日志主题的记录数量,该主题用于使存储容错。因此,它减少了 Kafka 集群的负载,还可以减少恢复时间。

对于 DSL 用户,缓存也会对下游负载产生影响(您可能对您的应用程序不感兴趣,因为您似乎正在使用处理器 API):