压缩的Kafka主题可以用作键值数据库吗?
Can compacted Kafka topic be used as key-value database?
在很多文章中,我了解到压缩的 Kafka 主题可以用作数据库。但是,在查看 Kafka API 时,我找不到允许我根据键查询主题以获取值的方法。
那么,压缩后的Kafka topic可以作为(高性能,只读)key-value数据库吗?
在我的架构中,我想为一个组件提供一个紧凑的主题。我想知道该组件是否需要在其本地数据库中拥有该主题的副本,或者它是否可以将该压缩主题用作键值数据库。
压缩的 kafka 主题本身和基本的 Consumer/Producer kafka APIs 不适合键值数据库。然而,它们被广泛用作持久化 KV Database/Cache 数据的后备存储,例如:在直写方法中。如果您出于某种原因需要重新预热缓存,只需重播整个主题即可重新填充。
在 Kafka 世界中,您拥有 Kafka Streams API which allows you to expose the state of your application, i.e: for your KV use case it could be the latest state of an order, by the means of queryable state stores. A state store is an abstraction of a KV Database and are actually implemented using a fast KV database called RocksDB which, in case of disaster, are fully recoverable,因为它的完整数据保存在 kafka 主题中,因此它非常有弹性,可以作为您用例的数据源。
假设这是您的 Kafka Streams 应用架构:
为了能够查询这些 Kafka Streams 状态存储,您需要在 Kafka Streams 应用程序中捆绑 HTTP 服务器和 REST API 以查询其本地或远程状态存储(Kafka distributes/shards 数据跨主题中的多个分区以实现并行处理和高可用性,以及 so does Kafka Streams)。因为 Kafka Streams API 为您提供了元数据,让您知道密钥所在的实例,您当然可以查询任何实例,如果密钥存在,则无论密钥所在的实例如何,都可以返回响应。
使用这种方法,您可以一次杀死两只鸟:
- 使用 Kafka Streams 进行大规模有状态流处理
- 以 KV 数据库查询模式样式向外部客户端公开其状态
全部在一个实时、高性能、分布式和弹性的架构中。
图片来源 from a wider article 由 Robert Schmid 提供,您可以在其中找到更多详细信息和使用 Kafka Streams 实现可查询状态存储的原型。
值得注意的提及:
如果您不想使用 Kafka Streams API 实现所有这些,请查看 ksqlDB from Confluent which provides an even higher level abstraction on top of Kafka Streams just using a cool and simple SQL dialect to achieve the same sort of use case using pull queries. If you want to prototype something really quickly, take a look at this answer by Robin Moffatt or even this blog post 以了解其简单性。
虽然 ksqlDB 不是 Apache Kafka 项目的一部分,但它是开源的、免费的,并且构建在 Kafka Streams 之上 API。
在很多文章中,我了解到压缩的 Kafka 主题可以用作数据库。但是,在查看 Kafka API 时,我找不到允许我根据键查询主题以获取值的方法。
那么,压缩后的Kafka topic可以作为(高性能,只读)key-value数据库吗?
在我的架构中,我想为一个组件提供一个紧凑的主题。我想知道该组件是否需要在其本地数据库中拥有该主题的副本,或者它是否可以将该压缩主题用作键值数据库。
压缩的 kafka 主题本身和基本的 Consumer/Producer kafka APIs 不适合键值数据库。然而,它们被广泛用作持久化 KV Database/Cache 数据的后备存储,例如:在直写方法中。如果您出于某种原因需要重新预热缓存,只需重播整个主题即可重新填充。
在 Kafka 世界中,您拥有 Kafka Streams API which allows you to expose the state of your application, i.e: for your KV use case it could be the latest state of an order, by the means of queryable state stores. A state store is an abstraction of a KV Database and are actually implemented using a fast KV database called RocksDB which, in case of disaster, are fully recoverable,因为它的完整数据保存在 kafka 主题中,因此它非常有弹性,可以作为您用例的数据源。
假设这是您的 Kafka Streams 应用架构:
为了能够查询这些 Kafka Streams 状态存储,您需要在 Kafka Streams 应用程序中捆绑 HTTP 服务器和 REST API 以查询其本地或远程状态存储(Kafka distributes/shards 数据跨主题中的多个分区以实现并行处理和高可用性,以及 so does Kafka Streams)。因为 Kafka Streams API 为您提供了元数据,让您知道密钥所在的实例,您当然可以查询任何实例,如果密钥存在,则无论密钥所在的实例如何,都可以返回响应。
使用这种方法,您可以一次杀死两只鸟:
- 使用 Kafka Streams 进行大规模有状态流处理
- 以 KV 数据库查询模式样式向外部客户端公开其状态
全部在一个实时、高性能、分布式和弹性的架构中。
图片来源 from a wider article 由 Robert Schmid 提供,您可以在其中找到更多详细信息和使用 Kafka Streams 实现可查询状态存储的原型。
值得注意的提及:
如果您不想使用 Kafka Streams API 实现所有这些,请查看 ksqlDB from Confluent which provides an even higher level abstraction on top of Kafka Streams just using a cool and simple SQL dialect to achieve the same sort of use case using pull queries. If you want to prototype something really quickly, take a look at this answer by Robin Moffatt or even this blog post 以了解其简单性。
虽然 ksqlDB 不是 Apache Kafka 项目的一部分,但它是开源的、免费的,并且构建在 Kafka Streams 之上 API。