关闭或不关闭kafka流应用程序中的RocksDB缓存和WriteBufferManager



我目前正在通过扩展RocksDBConfigSetter接口,在我的流应用程序中使用自定义RocksDB配置。我看到关于关闭cache&writeBufferManager实例。

现在,我看到javadoc&其中一个文档页面建议我们需要关闭重写的RocksDBConfigSetter#close()方法中所有扩展RocksObject的实例(CacheWriteBufferManager实例都扩展了这个类(。

但是,内存管理文档页面建议我们将这些实例创建为静态实例,而不是关闭重写的RocksDBConfigSetter#close()方法中的CacheWriteBufferManager实例。

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

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

两份文档都是正确的。

在第一个文档中,您提到的缓存是对象的一个字段。如果不关闭close()中的缓存,那么在Kafka Streams关闭相应的RocksDB状态存储后,它将从堆内存中泄漏,直到JVM退出。

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

当类由我们没有回调的类加载器卸载时,您将需要关闭静态缓存和静态写缓冲区管理器。我认为卸载是在JVM退出时发生的,所以在JVM退出之前,堆外内存不会泄漏,然后无论如何都会释放堆外内存。

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

最新更新