不要让Apache Kafka成为你的数据库

2023年 12月 10日 65.0k 0

作者丨Andrew Mills

编译丨诺亚

关于Kafka到底能否被认为是数据库的讨论由来已久。支持方认为,Kafka不应该仅仅是一个消息队列,其工作机制涉及到海量数据的存储与处理,根据需求Kafka 是可以作为数据库来使用的。而反对方则表示,Kafka 没有传统数据库的数据模型,也不能很好地支持查询优化,而且Kafka没有严格的隔离机制,也就无从保证在并发读写情况下的数据准确。

本文作者Andrew Mills是开源数据库公司Instaclustr的高级解决方案架构师,在他看来,将Kafka作为一个数据库来使用并不能解决问题。2016年,Andrew开始了他的数据流之旅,此后他设计和实现了几个以Kafka为核心的大数据管道,对Apache Kafka及其生态系统有了深厚的沉淀。       

企业总是在与其现有的关系数据库的性能和可伸缩性限制作斗争。负责寻找新解决方案的团队,着眼于事件驱动架构,发现了Apache Kafka,惊叹:“这就是我们需要的数据库解决方案!”它速度快、可扩展、高可用,正是他们期待的完美新解法。

这些团队将Kafka设置为他们的数据库,并期望它作为他们的可信单一数据源(SSOT),存取他们可能需要的所有数据。但是,这就是问题开始的时候。核心问题是Kafka实际上并不是一个数据库,使用它作为数据库并不能解决他们所遇到的可扩展性和性能问题。

1、“什么是数据库”正在被挑战   

当开发人员来定义一个数据库时,他们通常会想到具有二级索引和表的数据存储,就像大多数SQL和NoSQL解决方案一样。另一个传统需求是遵循ACID原则:即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。

然而,关于数据库定义的传统思维正在不断受到挑战。例如,Redis没有表,RocksDB没有二级索引。两者都不遵循ACID。但是,两者通常都被称为数据库。还有,比如Apache Cassandra被称为NoSQL数据库,但它同样不遵循ACID。  

我在Kafka上划清了界限,我认为它不是数据库,而且在很大程度上不应该被用作数据库。冒昧地说,我觉得Kafka社区大部分人在很大程度上都持有相似的观点。

Kafka没有查询语言。你可以访问特定时间段的特定记录,但是你访问的是预写日志。Kafka确实有偏移量和主题,但它们不能替代索引和表。而且,Kafka不符合ACID原则。虽然可以使用Kafka作为数据存储或创建自己版本的数据库,但Kafka本身并不是数据库。

这就引出了一系列问题:千方百计地使用Kafka作为数据库是否有意义?你的用例真的需要它吗?从长远来看,迫使Kafka像数据库一样运行,你又是否有足够的专业知识来承担随之而来的技术债务?对于大多数用户和用例,我的答案是坚决的否定。

2、Kafka取代不了关系数据库

为用例选择正确的技术,关键都在于,让解决方案与你试图解决的问题相匹配。Kafka旨在作为一个分布式事件流平台,仅此而已。虽然它可以用作长期数据存储(技术上),但这样做意味着在访问这些数据时需要进行重大权衡。

Kafka生态系统中的工具,比如ksqlDB,可以让Kafka感觉更像一个数据库,但这种方法只适用于中等规模的用例。大多数选择实现Apache Kafka的企业都有高速数据,而ksqlDB无法满足他们的需求。

正确的策略是让Kafka做它最擅长的事情,即以快速可靠的方式接收和分发事件。例如,考虑一个带有API的电子商务网站,该API通常会将所有数据直接保存到具有大量表的关系数据库中,因此性能、可扩展性和可用性都很差。引入Kafka,我们可以设计一个高级的事件驱动生态系统,将API中的数据作为事件推送到Kafka。

这种事件驱动的方法将处理分离为单独的组件。一个事件可能包含客户数据,另一个事件可能包含订单数据,等等——支持多个作业同时独立地处理事件。这种方法是企业架构的下一个发展方向。我们已经从单体到微服务,现在又发展到事件驱动架构,它拥有与微服务相同的诸多优点,比如,具有更高的可用性和更快的速度。

一旦事件被保存在Kafka中,你就可以非常灵活地处理它们。如果有需要将原始事件存储在关系数据库中,那么可以使用Kafka Connect这样的生态系统工具来简化这一过程。   

关系数据库仍然是现代企业架构中的一个关键工具,特别是当你考虑到,使用熟悉的工具和成熟的生态系统的优势是有优势的。Kafka并不是我们所熟悉的这些工具的替代品。它只是使我们能够处理我们所看到的大量涌入的数据。

3、可插拔且多功能,但不是一个数据库

Kafka在支持数据聚合和实时指标等用例方面提供了最大的价值。使用Kafka和Apache生态系统工具(如Spark、Flink或KStreams),开发人员可以对流数据进行聚合和转换,然后将这些数据推送到所需的数据库。其中一些工具还可以以时间序列或窗口方式聚合数据,并将其推送到报告引擎以获得实时指标。

如果开发人员希望将某些数据保存到缓存中——可能是为了支持网站或CRM系统——很简单,可以利用Kafka数据流并将数据推送到Redis或一个压缩的Kafka主题。来自Kafka的数据流允许团队添加他们认为合适的各种组件,而不用担心服务的降级,因为Kafka具有非常好的可扩展性、可靠性和可用性。这包括将数据输入任何数据存储,无论是Apache Cassandra、大数据平台、数据湖,还是几乎任何其他选择。

如果数据是现代企业的命脉,那么Kafka应该是数据生态系统的核心。使用Kafka,用户可以将数据传输到任何需要的地方。通过这种方式,Kafka是你的数据库的补充,但不应该是你的数据库。正确利用Kafka的方式应该包括“按其预期使用”的方向作为,这意味着将它视为一个强大的消息代理,事件流的处理中心、组织的核心数据管道。

参考链接:https://www.infoworld.com/article/3711181/dont-make-apache-kafka-your-database.html

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论