为什么Apache Kafka Streams使用RocksDB,如果需要更改,是否可能?

34

在研究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编码的数据库,也许它们可以像RocksDB那样高效运行,因为它们没有通过JNI。


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

37

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

来自@miguno以下的评论(重新表述):

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

来自@miguno的上面的评论:

FYI:"RocksDB不是用JVM兼容语言编写的,因此在部署时需要注意处理,因为它需要额外的共享库(操作系统相关)。"作为Kafka Streams的用户,你无需安装任何东西。

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

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


在Kafka的介绍页面上,它声明使用Kafka进行有状态存储。这是在撒谎吗?https://kafka.apache.org/intro - petertc
1
不确定您为什么认为这是错误的?请注意,本地存储仅是缓存-所有存储在本地存储中的数据也存储在Kafka主题中。 - Matthias J. Sax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接