我正在尝试了解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行为重叠。
答案 0 :(得分:2)
您的观察是正确的,并且是否需要缓存取决于使用情况。应用程序级缓存(而不是RocksDB缓存)的一大优势是,它减少了写入更改日志主题的记录数,这些记录用于使存储容错。因此,它减轻了Kafka集群的负载,还可以减少恢复时间。
对于DSL用户,缓存也会对下游负载产生影响(您可能对应用程序不感兴趣,因为您似乎正在使用Processor API)