在kafka streams app中关闭或不关闭RocksDB Cache和WriteBufferManager

To close or to not close RocksDB Cache and WriteBufferManager in kafka streams app

我目前正在通过扩展 RocksDBConfigSetter 界面在我的流应用程序中使用自定义 RocksDB 配置。我看到有关关闭 cache & writeBufferManager 实例的相互矛盾的文档。

现在,我看到 javadoc 和 documentation page 之一建议我们需要关闭所有扩展 RocksObject 的实例(CacheWriteBufferManager 实例在覆盖的 RocksDBConfigSetter#close() 方法中扩展此 class)。

但是,memory management documentation page 建议我们将这些实例创建为静态实例,而不是在覆盖的 RocksDBConfigSetter#close() 方法中关闭 CacheWriteBufferManager 实例。

不知道接下来要做什么。如果有人可以帮助我了解哪些文档是正确的,以及如果我们想通过传入自定义 rocksdb 配置来限制内存使用,首选方法是什么,我将不胜感激。

如果我们将它们声明为静态的,可以不关闭这些实例吗?

两个文档都是正确的。

first documentation你提到缓存是对象的一个​​字段。 close()如果不关闭缓存,Kafka Streams关闭对应的RocksDB state store后会泄漏堆外内存,直到JVM退出

您在 second documentation 中提到缓存和写缓冲区管理器是静态的。如果您在 close() 中关闭它们,第一个被 Kafka Streams 关闭的 RocksDB 状态存储将同时关闭,并且所有其他 RocksDB 状态存储很可能会崩溃,因为它们的缓存和写入缓冲区管理器已关闭。

当 class 被我们没有回调的 class 加载程序卸载时,您需要关闭静态缓存和静态写入缓冲区管理器。我认为卸载发生在 JVM 退出时,因此在 JVM 退出之前不会泄漏堆外内存,之后无论如何都会释放堆外内存。

关于您关于限制 RocksDB 内存使用的问题,答案取决于您要限制的内容。您是想限制一个 RocksDB 实例使用的内存,还是想限制在一个 Kafka Streams 客户端中使用的所有 RocksDB 实例的内存?对于前者,您应该使用第一个文档中的示例。对于后者,您应该使用第二个文档中的示例。