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

时间:2019-05-29 16:42:24

标签: apache-kafka apache-kafka-streams rocksdb

我正在尝试了解Kafka流处理器API中的RocksDB行为。我正在使用KStreams提供的默认RocksDB配置持久性StateStore。

StoreBuilder countStoreBuilder =
  Stores.keyValueStoreBuilder(
    Stores.persistentKeyValueStore("Counts"),
    Serdes.String(),
    Serdes.Long())

我没有进行任何聚合,联接或窗口化。我只是接收记录,并将其中一些记录与商店中的先前项目进行比较,并将我收到的某些记录存储在状态存储中。

开发人员指南提到,您可以通过在上述构建器上调用.withCachingEnabled()来启用Processor API中的记录缓存。

  

高速缓存“充当读取高速缓存,可加快从状态存储读取数据的速度”-Record Caches Kafka Streams

但是,我的理解是,处于持久模式的RocksDB首先会在内存中缓冲,并且只有在状态不适合RAM时才会扩展到磁盘中。

  

RocksDB仅用作内部查找表(如果状态不适合内存,则可以刷新到磁盘   仅因为状态可能大于可用的主内存,才需要进行RocksDB刷新。 Kafka Streams Internal Data Management

那么,如果两个记录缓存都缓存在内存中,那么记录缓存如何加快从状态存储的读取呢?在我看来,记录缓存与RocksDB行为重叠。

1 个答案:

答案 0 :(得分:2)

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

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