在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
的实例(Cache
和 WriteBufferManager
实例在覆盖的 RocksDBConfigSetter#close()
方法中扩展此 class)。
但是,memory management documentation page 建议我们将这些实例创建为静态实例,而不是在覆盖的 RocksDBConfigSetter#close()
方法中关闭 Cache
和 WriteBufferManager
实例。
不知道接下来要做什么。如果有人可以帮助我了解哪些文档是正确的,以及如果我们想通过传入自定义 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 实例的内存?对于前者,您应该使用第一个文档中的示例。对于后者,您应该使用第二个文档中的示例。
我目前正在通过扩展 RocksDBConfigSetter
界面在我的流应用程序中使用自定义 RocksDB
配置。我看到有关关闭 cache
& writeBufferManager
实例的相互矛盾的文档。
现在,我看到 javadoc 和 documentation page 之一建议我们需要关闭所有扩展 RocksObject
的实例(Cache
和 WriteBufferManager
实例在覆盖的 RocksDBConfigSetter#close()
方法中扩展此 class)。
但是,memory management documentation page 建议我们将这些实例创建为静态实例,而不是在覆盖的 RocksDBConfigSetter#close()
方法中关闭 Cache
和 WriteBufferManager
实例。
不知道接下来要做什么。如果有人可以帮助我了解哪些文档是正确的,以及如果我们想通过传入自定义 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 实例的内存?对于前者,您应该使用第一个文档中的示例。对于后者,您应该使用第二个文档中的示例。