写点什么

系统解读 Kafka 的流和表(一):开篇

  • 2020-02-07
  • 本文字数:2270 字

    阅读完需:约 7 分钟

系统解读Kafka的流和表(一):开篇

这是探索 Kafka 存储层和处理层核心基础系列文章的第一篇。在这篇文章中,我们将总体介绍事件、流、表以及流和表之间的二元性关系。后续的文章将着重探索 Kafka 的存储层,也就是流和表的分布式“文件系统”,然后再介绍位于存储层之上的处理层。


我与很多 Kafka 用户有过交流,他们当中有开发人员、运维人员和架构师,有一些有流式处理或 Kafka 使用经验,有一些精通关系型数据库(如 Oracle 和 MySQL),有一些则两者都不熟悉。不过,他们会问我相同的问题,比如:“事件流和数据库表之间有什么区别?Kafka 的主题跟流是同一种东西吗?如果把数据放在 Kafka 里,如何最大程度地利用它们?”

事件、流、表

我们先从最基本的开始:Kafka 是什么?Kafka 是一个事件流平台,它提供了这三个关键特性:


  1. 发布和订阅事件;

  2. 按需存储事件;

  3. 处理和分析事件。


那么这里所说的事件是什么东西?


事件记录了真实世界“发生了某件事情”。从概念上讲,一个事件包含一个键、一个值和时间戳。事件可以是一个普通的通知,可能不包含额外的信息,也可能包含所有可用于后续处理的细节。例如:


  • 键:“Alice”;

  • 值:“Is currently in Rome”;

  • 时间戳:“Dec. 3, 2019 at 9:06 a.m.”。


事件还可能是这样的:


  • 卖出一件商品;

  • 数据库表的一条记录被更新;

  • 风机传感器测量到叶片每分钟转 14 次;

  • 下棋时发生的一个动作,比如“白方将 e2 位置上的小兵移到 e4 上”;

  • Frank 在 2019 年 11 月 24 晚上 5 点 11 分向 Sally 支付了 200 美元。


事件流平台捕捉事件,将事件形成事件流。事件流按照事件的顺序记录了真实世界发生的历史,例如销售账簿或者象棋比赛时记录的棋子移动顺序。Kafka 的流可以记录几百年的业务历史事件。它们是按顺序排列的事件链,我们可以知道哪个事件是在哪个事件之前或之后发生的。所以,流代表了过去和现在:当时间从今天走向明天,或者从这一毫秒走到下一毫秒,新的事件会持续不断地被追加到历史中。


与事件流不一样,数据库的表代表的是世界在某个时间点的状态,通常是“现在”。例如,商品的总销量或者象棋比赛中棋盘的当前布局。表是事件流的一个视图,在捕捉到新事件时就会更新这个视图。



流记录了历史,表代表的是状态


在 Kafka 里,流和表有很多不一样的地方,其中最突出的一点是它们的内容是否可变(我所说的表是指 Kafka Streams 里的 KTable)。


  • 流提供的是不可变数据。它只支持插入(追加)新的事件,已有的事件不能被修改。流中的数据是持久化的,支持容错。流中的事件包含了键,一个键可以对应多个事件,比如“与 Bob 相关的所有支付事件”。不严格地说,你可以把流看成是关系型数据库里的一张表,只是它没有唯一键约束,而且只能追加记录。

  • 表提供的是可变数据。你可以插入新数据,已有的数据可以被更新或删除。事件的键(也就是数据行的标识)是可变的。与流一样,表也是持久化的,支持容错。现在的表就像是关系型数据库里的物化视图,当输入流发生变化时,它会自动更新,不会让你直接对它执行插入、更新或删除操作。


流和表的二元性

虽然流和表之间有所区别,但也存在非常紧密的联系。我们把它们之间的这种关系叫作流和表的二元性:


  • 我们可以通过一些聚合操作,比如 COUNT()或者 SUM(),将流转成表。在象棋比赛中,我们可以通过重放所有已记录的棋子移动事件来重建棋局的最新状态(也就是表)。

  • 我们也可以通过捕获表的变更事件(插入、更新、删除),把事件汇聚成“变更流”,这样就可以将表转成流。这个过程一般被称为变更数据捕获,简称 CDC(Change Data Capture)。在象棋比赛中,我们可以观察最新的棋子移动,并把它记录下来(加入到流中)。或者,我们也可以比较棋局状态前后的变化,将发生变化的部分记录下来,只是这种方式比前面那种要慢一些。


实际上,表的底层就是变更流。如果你有使用过 Oracle 或 MySQL,就应该知道,这些关系型数据库也存在变更流,只是实现细节被隐藏起来了,它们的名字叫重做日志(redo log)或二进制日志(binary log)。在事件流中,重做日志是一等实体,也就是流。我们可以将流转成表,也可以将表转成流。



因为流和表的二元性,我们可以很容易地将流转成表,或者反过来。


下面的例子使用 COUNT()将流聚合成一个表。为了方便展示,图中没有显示时间戳。随着新的事件不断被加入流中,表被持续更新,与关系型数据库的物化视图类似,只是它每秒钟可以支持数百万个事件。我们可以把这个想象成是对一个表进行 CDC,然后生成一个输出变更流。对一个事件流进行聚合操作则是反过来的:流成了表的输入变更流。


在这个例子中,事件流中事件的键为用户名,值为用户所在位置,事件被持续地聚合成表,并根据键来跟踪用户访问过的位置次数。



将事件流聚合成表


下面是这个例子对应的代码:



我们也可以看到表的输出变更流。变更流对表的变更做出实时响应,以此来生成警报。它也可以被用在运维中,比如将一个表从机器 A 迁移到机器 B 上。



每张表都自己的变更流(也叫变更日志)


在后续的文章中,我们将会继续讨论流和表的二元性,它是 Kafka 弹性伸缩和容错能力的基础!

总结

在这篇文章中,我们了解了事件流平台的基本元素:事件、流和表。我们还介绍了流和表的二元性,以及为什么说二元性是事件流平台(如 Kafka)的核心。当然,这篇文章只是一个开始,在下一篇文章中,我们将深入了解 Kafka 的主题、分区和存储。


原文链接:


https://www.confluent.io/blog/kafka-streams-tables-part-1-event-streaming/


2020-02-07 12:012924
用户头像
蔡芳芳 InfoQ主编

发布了 798 篇内容, 共 544.6 次阅读, 收获喜欢 2786 次。

关注

评论 2 条评论

发布
用户头像
原文的GIF,译文只有静态的图片
2021-10-24 01:02
回复
用户头像
good

2020-06-10 15:30
回复
没有更多了
发现更多内容

程序员手把手教你参与开源!拿捏!

快乐非自愿限量之名

开源 程序员 面试

大数据处理流程包括哪些环节

悦数图数据库

大数据处理流程

支撑核心系统分布式改造,GaussDB为江南农商银行筑稳根基

华为云开发者联盟

数据库 分布式数据库 后端 华为云 华为云开发者联盟

万字图解 | 深入揭秘Linux 接收网络数据包

云舒编程

数据包 中断 网卡 linux\ ringbuffer

软件测试学习笔记丨Grafana安装

测试人

软件测试

Footprint 的卓越资金流数据揭示加密货币的神秘叙事

Footprint Analytics

区块链 数据分析 加密货币

第三届“新科技 星力量” 科技实践案例评选【获奖名单】揭晓

星环科技

大数据 科技 大模型 获奖

如何让你的.NET WebAPI程序支持HTTP3?

不在线第一只蜗牛

Web 开发语言 http3 .NET 7

近6成金融机构的选择!华为云GaussDB加快金融核心系统转型

华为云开发者联盟

数据库 后端 华为云 华为云GaussDB 华为云开发者联盟

图像处理-Java-指定大小压缩

alexgaoyh

Java 图像处理 图像压缩 压缩算法 指定大小

星环科技基于第五代英特尔®至强®可扩展处理器的分布式向量数据库解决方案重磅发布

星环科技

大数据 信创 科技 大模型

万字图解 | 深入揭秘HTTP工作原理

云舒编程

多路复用 HTTP web socket QUIC 图解网络

这一年我们上线的运维自动化系统

37丫37

DevOps 运维 自动化 工具 开发.

英特尔实现3D先进封装技术的大规模量产

E科讯

指标平台详解(下):第三代指标平台实现了哪些突破?

Aloudata

BI ETL 指标中台; 指标中台

日志资源成本减少35%:新东方可观测体系改造如何降本增效?

TakinTalks稳定性社区

新书上线 | 《使用 NGINX 部署和保护 Kubernetes Ingress Controller》中文版

NGINX开源社区

nginx Kubernetes API NGINX Ingress Controller NGINX Service Mesh

AppLink让你的电商运营财务管理自动化

RestCloud

零代码 APPlink 自动化集成

有了这张微积分知识地图,你可能会爱上高数!

博文视点Broadview

WorkPlus AI智能客服解决方案,提升企业服务质量

WorkPlus

原来阿里字节员工简历长这样

云舒编程

简历模板 简历 应届生 大厂面试】 #面试

万字图解 | 深入揭秘TCP工作原理

云舒编程

三次握手 TCP协议 TCP四次挥手 MSL 滑动窗口

软件测试学习笔记丨JMeter使用代理录制脚本

测试人

软件测试

实力认可!TDengine 在“2023 年度金猿季”两大榜单中脱颖而出

TDengine

tdengine 时序数据库

Python 变量?对象?引用?赋值?一个例子解释清楚

EquatorCoco

Python 前端 变量 对象 开发语言

MySQL并发插入导致死锁

云舒编程

MySQL 并发 死锁

探索技术的无限可能-云原生计算2023年度奖项

字节跳动云原生计算

大数据 云原生

全面升级!Apache HugeGraph 1.2.0版本发布

百度安全

(保姆级)服务器-Zabbix6.0使用Python脚本实现带图片的邮箱的报警

不在线第一只蜗牛

Python 运维 服务器

一分钟了解Wireshark的数据包

小齐写代码

系统解读Kafka的流和表(一):开篇_语言 & 开发_Michael Noll_InfoQ精选文章