近些年,圈子里有一个讨论很有趣,是关于 Kafka 到底可不可以认为是一个数据库,这个讨论起始于2017年,并由此衍生出了 KSQL、KarelDB 等基于 Kafka 完成的数据库。这篇文章简单回顾下争论双方的观点。
正方观点是支持 Kafka 是数据库,他们认为 Kafka 有潜力成为数据的 source-of-truth ,也就是说取代传统数据库的某一项职能。
反方观点则认为 Kafka 不是一个数据库。
首先,讨论 Kafka 是不是数据库的起点来源于 Apache Kafka 和 Confluent 的联合创始人 Jay Kreps 在 2017 年的文章It's Okay To Store Data In Kafka(稍微解释下,Jay Kreps 也是网上流传很广的The Log: What every software engineer should know about real-time data's unifying abstraction的作者)。在It's Okay To Store Data In Kafka这篇文章里作者认为 Kafka 不应该仅仅是一个消息队列,也可以实现日志存储功能,用户可以基于 Kafka 里的存储的日志回放任一时刻的数据快照。注意:此时,Jay Kreps 依然认为 Kafka 不能作为一个通用数据库使用。
直到is apache kafka a database the 2020 update这篇文章的诞生(其实前面还有martin kleppmann对数据库的讨论Is Kafka a Database?),又一次引发了 Kafka 到底能不能作为一个数据库使用的讨论。在这篇文章里,主要观点有下面几个:
并由此得出了一个结论:
Kafka 是一个数据库,提供了 ACID 保证,然而,它的工作方式与其他数据库不同。Kafka 也不是要取代其他数据库,相反,它是你的工具集中的一个补充工具。
反方观点很简单,他们认为 Kafka 没有传统数据库的数据模型,也没有索引机制,也没有很好地查询优化,最重要的 Kafka 没有严格的隔离机制,也就无从谈起在并发读写情况下的数据准确性。
关于 Kafka 是一个数据库的理论基础来源于《Streaming Systems》中提到的流和表的一体两面,表是静态的数据,流是动态的数据。简而言之:
流平台捕捉事件,将事件形成事件流。事件流按照事件的顺序记录了真实世界发生的历史。也就是说:流代表了过去和现在:当时间从今天走向明天,或者从这一毫秒走到下一毫秒,新的事件会持续不断地被追加到历史中。 数据库的表代表的是世界在某个时间点的状态,通常是“现在”。表是事件流的一个视图,在捕捉到新事件时就会更新这个视图。
Kafka 团队就在试图将上述理论变为现实,在某种意义上实现流和表的统一,这个时候 Kafka 也就成为了所谓的 source-of-truth。
理想是美好的,现实是残酷的。
不是使用 SQL 查询数据就可以认为是数据库,数据库也不仅仅具有存储功能,Kafka 缺失了数据库应该有的索引、事务等特性。所以我认为:Kafka 最好的定位还是作为一个事件流的处理中心,用于保证各个不同系统的数据一致性,而不是取代传统的数据库。
参考文章: