【问题标题】:To close or to not close RocksDB Cache and WriteBufferManager in kafka streams app在kafka流应用程序中关闭或不关闭RocksDB Cache和WriteBufferManager
【发布时间】:2020-12-02 08:24:46
【问题描述】:

我目前正在通过扩展RocksDBConfigSetter 接口在我的流应用程序中使用自定义RocksDB 配置。我看到关于关闭 cachewriteBufferManager 实例的文档存在冲突。

现在,我看到 javadoc 和 documentation page 之一建议我们需要关闭所有扩展 RocksObject 的实例(CacheWriteBufferManager 实例都扩展了这个类)在被覆盖的 @ 987654330@方法。

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

不知道这里要遵循什么。如果有人能帮助我了解哪些文档是正确的,如果我们想通过传入自定义的 RocksDB 配置来限制内存使用量,那么我们将不胜感激。

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

【问题讨论】:

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


    【解决方案1】:

    两个文件都是正确的。

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

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

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 2016-07-20
    相关资源
    最近更新 更多