为啥 Apache Kafka Streams 使用 RocksDB 以及如何改变它?

Posted

技术标签:

【中文标题】为啥 Apache Kafka Streams 使用 RocksDB 以及如何改变它?【英文标题】:Why Apache Kafka Streams uses RocksDB and if how is it possible to change it?为什么 Apache Kafka Streams 使用 RocksDB 以及如何改变它? 【发布时间】:2017-02-27 20:40:14 【问题描述】:

在研究 Apache Kafka 0.9 和 0.10 的新功能期间, 我们使用过 KStreams 和 KTables。有一个有趣的事实是 Kafka 在内部使用 RocksDB。 见Introducing Kafka Streams: Stream Processing Made Simple。 RocksDB 不是用 JVM 兼容语言编写的,因此需要仔细处理部署,因为它需要额外的共享库(取决于操作系统)。

这里有一些简单的问题:

为什么 Apache Kafka Streams 使用 RocksDB? 如何改变它?

我曾试图寻找答案,但我只看到隐含的原因,即 RocksDB 对于每秒数百万次操作范围内的操作非常快。

另一方面,我看到一些用 Java 编码的 DB,也许端到端它们可以做到这一点,而且它们不会通过 JNI。

【问题讨论】:

@miguno:如果没有错误,你是对的 :-)。但是当出现错误或需要调试会话时,任何非本地代码都会使操作变得相当复杂,或者?第二个问题是我在文档中没有看到任何说明 Kafka Streams 将在哪些平台上运行的规范,因为它将受到 RocksDB 共享库的限制。这是一个透明度问题。 【参考方案1】:

使用 RocksDB 有几个(内部)原因(正如您已经提到的,例如它的性能)。从概念上讲,Kafka Streams 不需要 RocksDB——它被用作内部键值缓存,任何其他提供类似功能的存储也可以工作。

来自@miguno 的评论如下(改述):

与纯内存键值存储相比,RocksDB 的一个重要优势是它能够写入磁盘。因此,Kafka Streams 可以支持大于可用主内存的状态。

来自以上@miguno 的评论:

仅供参考:"RocksDB is not written in JVN compatible language, so it needs careful handling of the deployment, as it needs extra shared library (OS dependent)." 作为 Kafka Streams 的用户,您无需安装任何东西。

使用 Kafka Streams DSL,从 0.10.2 版本 (KAFKA-3825) 开始,可以插入自定义状态存储并使用不同的键值存储。

使用 Kafka Streams Processor API,您可以通过StateStore 接口实现自己的存储,并将其连接到拓扑中的处理器节点。

【讨论】:

在kafka的介绍页面中,写着uses Kafka for stateful storage 。是在撒谎吗? kafka.apache.org/intro 不确定为什么您认为这不正确?请注意,本地存储只是缓存——存储中的所有数据也存储在 Kafka 主题中。

以上是关于为啥 Apache Kafka Streams 使用 RocksDB 以及如何改变它?的主要内容,如果未能解决你的问题,请参考以下文章

[译] 流式处理:使用 Apache Kafka 的 Streams API 实现 Rabobank 的实时财务告警

Apache Kafka 1.0.0 Streams API Multiple Multilevel groupby

具有 2 个功能的 Apache Kafka Streams 应用程序不起作用

Kafka---窗口函数

Kafka Streams 开发单词计数应用

带有Spring Cloud Stream的Kafka Streams进程中的Serd错误