压缩的Kafka主题可以用作键值数据库吗?

wxclj1h5  于 2021-06-04  发布在  Kafka
关注(0)|答案(1)|浏览(335)

在许多文章中,我读到压缩Kafka主题可以用作数据库。但是,在查看kafkaapi时,我找不到允许我在主题中查询基于键的值的方法。
那么,压缩的kafka主题可以用作(高性能、只读)键值数据库吗?
在我的体系结构中,我希望为组件提供一个压缩的主题。我想知道该组件是否需要在其本地数据库中有该主题的副本,或者是否可以使用压缩的主题作为键值数据库。

5anewei6

5anewei61#

压缩的kafka主题本身和基本的消费者/生产者kafka api不适合键值数据库。然而,它们被广泛用作持久化数据库/缓存数据的后台存储,例如:在写通方法中。如果出于某种原因需要重新预热缓存,只需重放整个主题即可重新填充。
在kafka世界中,您拥有kafka streams api,它允许您公开应用程序的状态,即:对于您的kv用例,它可以是订单的最新状态,通过可查询的状态存储。状态存储是kv数据库的抽象,实际上是使用一个名为rocksdb的快速kv数据库实现的,在发生灾难时,它是完全可恢复的,因为它的完整数据被保存在一个kafka主题中,所以它非常有弹性,可以作为用例的数据源。
假设这是您的kafka streams应用程序体系结构:

为了能够查询这些kafka streams状态存储,您需要在kafka streams应用程序中绑定http服务器和restapi,以查询其本地或远程状态存储(kafka在主题中跨多个分区分发/切分数据,以实现并行处理和高可用性,kafka streams也是如此)。因为kafka streams api提供元数据让您知道密钥驻留在哪个示例中,所以您肯定可以查询任何示例,如果密钥存在,则无论密钥驻留在哪个示例中,都可以返回响应。

通过这种方法,你可以一枪打死两只鸟:
使用kafka流进行大规模有状态流处理
以kv数据库查询模式样式向外部客户机公开其状态
所有这些都在一个实时、高性能、分布式和弹性的体系结构中。
这些图片来源于robertschmid的一篇更广泛的文章,在那里你可以找到更多的细节和一个用kafka流实现可查询状态存储的原型。
值得一提的是:
如果您不想使用kafka streams api来实现所有这些,请看一下confluent中的ksqldb,它在kafka streams之上提供了一个更高级别的抽象,只需使用一个酷而简单的sql方言,就可以使用pull查询来实现同样的用例。如果你真的想快速原型化一些东西,看看罗宾·莫法特的这个答案,甚至是这篇博客文章,来掌握它的简单性。
虽然ksqldb不是apachekafka项目的一部分,但它是开源的、免费的,并且构建在kafka streams api之上。

相关问题