乐趣区

关于数据库:程序员科普时间Kafka-不是数据库

了解流式基础设施的应用和滥用,这一点很重要。

Kafka 是一种音讯代理,在过来几年中迅速流行起来。音讯代理曾经存在很长时间了,它们是一种专门用于在生产者和消费者零碎之间“缓冲”音讯的数据存储。Kafka 曾经相当风行,因为它是开源的,并且可能反对海量的音讯。

音讯代理通常用于解耦数据的生产者和消费者。例如,咱们应用一个相似 Kafka 的音讯代理来缓冲客户生成的 Webhook,而后将它们批量加载到数据仓库中。

在这个场景中,音讯代理提供了从客户发送事件到 Fivetran 将它们加载到数据仓库之间的事件长久存储。

然而,Kafka 有时候也被形容为是一种比音讯代理更大的货色。这个观点的支持者将 Kafka 定位为一种全新的数据管理形式,Kafka 取代了关系数据库,用于保留事件的最终记录。与读写传统数据库不同,在 Kafka 中,先是追加事件,而后从示意以后状态的上游视图中读取数据。这种架构被看成是对“数据库的颠覆”。

原则上,以一种同时反对读和写的形式实现这个架构是有可能的。然而,在这个过程中,最终会遇到数据库管理系统几十年来遇到的所有难题。你或多或少须要在应用程序层开发一个功能齐全的 DBMS,而你可能不会做得太好,毕竟一个数据库须要很多年能力做好。你须要解决脏读、幻读、写偏移等问题,还要应酬匆忙实现的数据库存在的所有其余问题。

ACID 窘境

将 Kafka 作为数据存储的一个最根本的问题是它没有提供隔离机制。隔离意味着在全局内,所有事务 (读和写) 都是沿着某些统一的历史记录产生的。Jepsen 提供了一个隔离级别指南(https://jepsen.io/consistency))。

咱们举一个简略的例子来阐明为什么隔离很重要:假如咱们正在经营一个在线商店。当用户结账时,咱们要确保他们下的订单都有足够的库存。咱们是这样做的:

  1. 检查用户购物车中每个物品的库存程度。
  2. 如果某个物品没有库存,则停止结账。
  3. 如果所有物品都有库存,从库存中减去它们,并确认。

假如咱们应用 Kafka 来实现这个流程。咱们的架构可能看起来像这样:

Web 服务器从 Kafka 上游的库存视图读取库存,但它只能在 Checkouts 主题的上游提交事务。问题在于并发管制:如果有两个用户争着购买最初一件商品,那么只有一个用户能够购买胜利。咱们须要读取库存视图,并在一个独自的工夫点确认结帐。然而,在这个架构中没有方法做到这一点。

咱们当初遇到的问题叫做写偏移。当结账事件被解决时,从库存视图中读取的数据可能曾经过期。如果两个用户同时尝试购买雷同的物品,他们都将购买胜利,那么咱们便没有足够的库存供给给他们。

这种基于事件溯源的架构存在很多相似这样的隔离异样,让用户感到很困惑。更蹩脚的是,钻研表明,容许异样存在的架构也存在安全漏洞,给了黑客窃取数据的机会,正如这篇文章(https://www.cockroachlabs.com/blog/acid-rain)所写的那样。

将 Kafka 作为传统数据库的补充

如果你只是将 Kafka 作为传统数据库的补充,这些问题就能够防止:

OLTP 数据库负责执行音讯代理不太善于的要害工作:事件的准入管制。与将音讯代理作为“触发并忘记”事件的容器不同,OLTP 数据库能够回绝冲突性事件,确保只接管一个具备一致性的事件流。OLTP 数据库在这一外围并发管制工作上做得十分杰出——可扩大到每秒解决数百万个事务。

当应用数据库作为数据入口,从数据库读取事件的最佳办法是通过 CDC(变更数据捕捉)。市场上有几个很棒的 CDC 框架,例如 Debezium(http://debezium.io/)和 Maxwell(http://maxwells-daemon.io/),以及来自古代 SQL 数据库的原生 CDC。CDC 还提供了优雅的运维解决方案。在进行数据恢复时,能够革除上游的所有内容,并从(长久化的)OLTP 数据库从新构建。

不要随便构建谬误的数据库

几十年来,数据库社区曾经总结了一些重要的经验教训。这些教训都是在造成数据损坏、数据失落和让用户蒙受损失的状况下取得的,并为此付出了惨重的代价。如果你不小心构建了一个谬误的数据库,那么你会发现自己只不过是在从新经验这些经验教训。

实时流式音讯代理是治理疾速变动的数据的一个很好的工具,但你依然须要一个传统的 DBMS 来实现事务隔离。要实现一个“颠覆性的数据库”,能够应用 OLTP 数据库进行准入管制,应用 CDC 进行事件生成,并将数据的上游正本变成物化视图。

原文链接:https://materialize.com/kafka-is-not-a-database

举荐浏览

MySQL 从入门到进阶教程

字节跳动总结的设计模式 PDF 火了,完整版凋谢下载

刷 Github 时发现了一本阿里大神的算法笔记!标星 70.5K

程序员 50W 年薪的常识体系与成长路线。

月薪在 30K 以下的 Java 程序员,可能听不懂这个我的项目;

对于【暴力递归算法】你所不晓得的思路

开拓鸿蒙,谁做零碎,聊聊华为微内核

 
=

看完三件事❤️

如果你感觉这篇内容对你还蛮有帮忙,我想邀请你帮我三个小忙:

点赞,转发,有你们的『点赞和评论』,才是我发明的能源。

关注公众号『Java 斗帝』,不定期分享原创常识。

同时能够期待后续文章 ing????

退出移动版