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