NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

系统解读 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:012712
用户头像
蔡芳芳 InfoQ主编

发布了 781 篇内容, 共 494.8 次阅读, 收获喜欢 2748 次。

关注

评论 2 条评论

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

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

如何通过Java应用程序将PDF转为图片格式?

在下毛毛雨

PDF 图片 格式转换

管理研发团队后,我发现用「速率」做度量错得离谱……

LigaAI

研发管理 研发效能 技术管理 效能度量 企业号 3 月 PK 榜

万字详解AI开发中的数据预处理(清洗)

Baihai IDP

人工智能 机器学习 数据清洗 数据预处理 企业号 3 月 PK 榜

从0到1:学员课时预约与扣课小程序开发笔记

CC同学

备战金三银四:2023年1200道Java面试真题合集,助你搞定面试官

采菊东篱下

Java 面试

非常小的一个东西,Spring依赖注入Bean类型的8种情况

小小怪下士

Java spring 程序员 后端

GPT-4创造者:第二次改变AI浪潮的方向

OneFlow

Github百万收藏!一份《从零开始写分布式服务框架》称霸榜首!

程序知音

Java 分布式 编程语言 java架构 后端技术

别再说被八股文害惨了!GitHub阿里Java面试题库标星145K不无道理

Java你猿哥

Java 面试 面经 八股文 Java八股文

多功能文件搜索软件:HoudahSpot中文版

真大的脸盆

Mac Mac 软件 文件搜索 搜索工具 搜索文件

强大的macOS效率工具,Alfred 5更新变动详解

Rose

Alfred Mac软件 Alfred 5 苹果效率工具

博睿数据数智领航营首场开营:保险科技数智化转型中的智能运维实践

博睿数据

智能运维 博睿数据 数智化转型 保险行业

PD虚拟机如何安装ARM版CentOS Linux系统镜像(苹果M1专用)

Rose

pd虚拟机 pd18虚拟机 CentOS Linux系统 Centos Stream 9

迟来的Offer,至今已有672名学长靠这套Java八股文成功入职大厂

Java你猿哥

Java 面试 面经 春招 八股文

DevOps 在未来将如何演进?丨行业观察

SEAL安全

DevOps 平台工程

京东金融Android瘦身探索与实践

京东科技开发者

架构 sdk 安装包瘦身 APK 企业号 3 月 PK 榜

Sentinel Go- 揭秘 [热点参数] 的实现原理

柠檬汁Code(binbin0325)

golang 中间件 限流 原理分析 Sentienl

mac版photoshop 2023存储为窗口显示空白、黑屏如何解决

Rose

PhotoShop ps2023存储空白 空白、黑屏

Github 爆火,阿里巴巴大牛都在强推的 Java 性能优化实践小册!

架构师之道

Java 编程 计算机

奇点云数据云平台如何确保“多租户”安全?从某大型零售企业实践说起

Geek_2d6073

2023年阿里发布Redis最新版进阶笔记,真的香

开心学Java

Java redis 并发

2023年最新互联网Java面试八股文出炉(附大厂P5-P8技术栈)

架构师之道

Java 程序员 面试

详细分析Spring Boot启动流程

Java你猿哥

spring Spring Boot SpringBoot启动流程

graphpad prism教程:如何使用 prism医学绘图分析软件?

Rose

prism破解版 prism教程 医学绘图分析

预约直播|3月30日下周四,应用促活大揭秘,快速提升DAU

HMS Core

HMS Core

【ASPLOS 2023】图神经网络统一图算子抽象uGrapher,大幅提高计算性能

阿里云大数据AI技术

人工智能 机器学习 性能优化 图神经网络 企业号 3 月 PK 榜

Go 第三方 log 库之 zap 使用

江湖十年

后端 日志 Go 语言

实战开发arthas-spring-boot-starter,监控你的微服务是否健康!

Java你猿哥

spring Spring Boot

在路上!OceanBase首次公布四大“开发者友好”实践

OceanBase 数据库

数据库 oceanbase

想要找macOS系统上跑分工具?Geekbench 6帮助您快速,准确地测量处理器和内存性能进行测试

Rose

mac系统 系统跑分 Geekbench Geekbench 6

机器学习系列入门系列[七]:基于英雄联盟数据集的LightGBM的分类预测

汀丶人工智能

数据挖掘 机器学习 LightGBM

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