压缩的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 为您提供了元数据,让您知道密钥所在的实例,您当然可以查询任何实例,如果密钥存在,则无论密钥所在的实例如何,都可以返回响应。

使用这种方法,您可以一次杀死两只鸟:

  1. 使用 Kafka Streams 进行大规模有状态流处理
  2. 以 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。