Kafka Streams 实战——欢迎来到 Kafka 事件流平台

195 阅读20分钟

本章内容

  • 定义事件流和事件
  • 介绍Kafka事件流平台
  • 将平台应用于具体示例

虽然持续不断的数据流为消费者创造了更多的娱乐和机会,但这些信息的使用者越来越多地变成了使用其他软件系统的软件系统。例如,想想从您最喜欢的电影流媒体应用观看电影这一基本交互。您登录应用程序,搜索并选择一部电影,然后观看它,之后您可能会提供评分或某种关于您对这部电影喜爱程度的指示。仅仅这个简单的交互就会生成几个被电影流媒体服务捕获的事件。但是,如果要让这些信息对业务有用,就需要进行分析。这就是所有其他软件发挥作用的地方。

1.1 事件流

软件系统消费并存储从您的交互以及其他订阅者的交互中获得的所有信息。然后,其他软件系统使用这些信息向您提供推荐,并为流媒体服务提供关于未来应该提供什么节目的洞察。现在,考虑到这个过程每天发生数十万甚至数百万次,您就能看到企业需要利用的海量信息,以及他们的软件需要理解这些信息以满足客户需求和期望并保持竞争力。

另一种思考这个过程的方式是,现代消费者所做的一切,从在线观看电影到在实体店购买一双鞋,都会产生一个事件。一个组织要在我们的数字经济中生存和发展,就必须有一种有效的方式来捕获和响应这些事件。换句话说,如果企业想要满足客户并保持健康的盈利,就必须找到方法来跟上这种无尽事件流的需求。开发人员将这种持续的流称为事件流。而且,他们越来越多地通过事件流平台来满足这种无尽数字活动的需求,该平台利用一系列事件流应用程序。

事件流平台类似于我们的中枢神经系统,它处理数百万个事件(神经信号),并作为响应,向身体的适当部位发送消息。我们的有意识思想和行动产生了其中一些响应。当我们饿了并打开冰箱时,中枢神经系统收到消息并发出另一个消息,告诉手臂去拿第一层架子上的一个漂亮的红苹果。其他动作,比如心率因期待激动人心的消息而增加,则是无意识地处理的。

事件流平台捕获从移动设备、客户与网站的交互、在线活动、货运跟踪和其他业务交易中生成的事件。但是,该平台就像神经系统一样,不仅仅是捕获事件。它还需要一种机制来可靠地传输和存储这些事件的信息,并按照它们发生的顺序。然后,其他应用程序可以处理或分析这些事件以提取不同的信息片段。

实时处理事件流对于做出时间敏感的决策至关重要。例如,客户X的这次购买看起来可疑吗?这个温度传感器的信号是否表明制造过程中出了问题?路由信息是否已发送到企业的相应部门?

但事件流平台的价值不仅仅在于获取即时信息。提供持久存储使我们能够回头查看原始形式的事件流数据,对数据进行一些操作以获得更多洞察,或重放一系列事件以尝试理解导致特定结果的原因。例如,一个电子商务网站在大节日后的周末对几种产品提供了极好的优惠。对促销的反应如此强烈,以至于导致几台服务器崩溃,使业务停机了几分钟。通过重放所有客户事件,工程师可以更好地理解是什么导致了故障,以及如何修复系统使其能够处理突然的大量活动。

那么,您在哪里需要事件流应用程序呢?由于生活中的一切都可以被视为事件,任何问题领域都将从处理事件流中受益。但有些领域这样做更为重要。以下是一些典型的例子:

  • 信用卡欺诈 — 信用卡所有者可能不知道未经授权的使用。通过根据既定模式(位置、一般消费习惯)实时审查购买行为,您可能能够检测到被盗的信用卡并提醒所有者。
  • 入侵检测 — 实时监控异常行为的能力对于保护敏感数据和组织的福祉至关重要。
  • 物联网 — 在物联网中,传感器位于各种地方并频繁发送数据。快速捕获和有意义地处理这些数据的能力至关重要;任何不足都会削弱部署这些传感器的效果。
  • 金融行业 — 实时跟踪市场价格和走向的能力对于经纪人和消费者做出关于何时买卖的有效决策至关重要。
  • 实时共享数据 — 拥有许多应用程序的大型组织(如公司或企业集团)需要以标准、准确和实时的方式共享数据。

底线:如果事件流提供了重要且可操作的信息,企业和组织就需要事件驱动的应用程序来利用所提供的信息。

但流式应用程序并不适合所有情况。当您在不同地方有数据或有大量事件需要分布式数据存储时,事件流应用程序才变得必要。因此,如果您可以用单个数据库实例管理,流式处理就是不必要的。例如,一个小型电子商务企业或一个主要包含静态数据的地方政府网站就不适合构建事件流解决方案。

在本书中,您将学习事件流开发,了解何时以及为什么它是必要的,以及如何使用Kafka事件流平台构建健壮且响应迅速的应用程序。您将学习如何使用Kafka流平台的各种组件来捕获事件并使它们可供其他应用程序使用。我们将介绍使用平台组件进行简单操作(如写入(生产)或读取(消费)事件)到需要复杂转换的高级有状态应用程序,以便您可以使用事件流方法解决适当的业务挑战。本书适合任何希望开始构建事件流应用程序的开发人员。

虽然书名《Kafka Streams实战》专注于Kafka Streams,但本书从头到尾教授整个Kafka事件流平台。该平台包括关键组件,如生产者、消费者和模式,在构建流式应用程序之前您必须使用这些组件,您将在第1部分中学习这些内容。因此,我们直到本书后面的第6章才会涉及Kafka Streams本身的主题。但增强的覆盖范围是值得的。Kafka Streams是建立在Kafka事件流平台组件之上的抽象,因此了解这些组件可以让您更好地掌握如何使用Kafka Streams。

1.2 什么是事件?

我们已经定义了事件流,但什么是事件呢?我们将事件简单地定义为"发生的某件事"(www.merriam-webster.com/dictionary/…)。虽然"事件"这个词可能会让人想到一些值得注意的事情,比如孩子的出生、婚礼或体育赛事,但我们将专注于更小、更持续的事件,比如客户进行购买(在线或线下)、点击网页上的链接或传感器传输数据。事件可以由人或机器产生。正是事件的序列和它们的持续流动构成了事件流。

从概念上讲,事件包含三个主要组成部分:

  • 键(Key) — 事件的标识符
  • 值(Value) — 事件本身
  • 时间戳(Timestamp) — 事件发生的时间

让我们更详细地讨论事件的这些部分。键可以是事件的标识符,正如我们将在后面的章节中学到的,它在路由和分组事件中起着作用。想想在线购买:使用客户ID就是键的一个很好的例子。值是事件负载本身。事件值可以是触发器,比如当有人开门时激活传感器,或者是某个动作的结果,比如在线销售中购买的商品。最后,时间戳是记录事件发生时的日期时间。当我们学习本书的各个章节时,我们将经常遇到这个"事件三位一体"的所有三个组成部分。

我在这个介绍中使用了很多不同的术语,所以让我们用一个定义表来结束本节(表1.1)。

表1.1 定义

术语定义
事件(Event)发生的某件事及其记录的属性
事件流(Event Stream)从移动设备或物联网设备等源实时捕获的一系列事件
事件流平台(Event Streaming Platform)处理事件流的软件——能够生产、消费、处理和存储事件流
Apache Kafka首要的事件流平台——在一个经过实战检验的解决方案中提供事件流平台的所有组件
Kafka StreamsKafka的原生事件流处理库

1.3 事件流示例

假设您购买了一个时间机器核心组件(flux capacitor),并且很期待收到您的新购买品。让我们通过图1.1中的插图作为指南,走过直到您收到全新时间机器核心组件的各个事件。

image.png

考虑收到您的时间机器核心组件的步骤:

  1. 您在零售商网站上完成购买,网站提供了一个追踪号码。
  2. 零售商的仓库收到购买事件信息,将时间机器核心组件装上运输卡车,记录您的购买离开仓库的日期和时间。
  3. 卡车到达机场,司机将时间机器核心组件装上飞机并扫描条形码,记录日期和时间。
  4. 飞机降落,包裹再次被装上卡车,前往区域配送中心。快递服务记录了装载您的时间机器核心组件的日期和时间。
  5. 从机场来的卡车到达区域配送中心。快递服务员工卸下时间机器核心组件,扫描到达配送中心的日期和时间。
  6. 另一名员工拿起您的时间机器核心组件,扫描包裹,保存日期和时间,并将其装上准备送货给您的卡车。
  7. 司机到达您家,最后一次扫描包裹,然后交给您。您可以开始建造您的时光旅行汽车了!

从这个例子中,您可以看到日常行为如何创建事件,从而形成事件流。各个事件包括最初的购买、包裹每次转手以及最终交付。这个场景代表了仅由一次购买生成的事件。但如果您想想亚马逊的购买以及产品的各种运输商所生成的事件流,事件数量很容易达到数十亿或数万亿。

1.4 介绍Apache Kafka事件流平台

Kafka事件流平台提供了从头到尾实现事件流应用程序的核心能力。我们可以将这些能力分解为三个主要领域:发布/消费持久存储处理。这个移动、存储和处理三部曲使Kafka能够作为您数据的中枢神经系统运行。

在继续之前,说明Kafka作为数据中枢神经系统的含义将很有帮助。我们将通过展示前后对比的插图来说明这一点。让我们首先看一个事件流解决方案,其中每个输入源都需要单独的基础设施(图1.2)。

image.png

在这个插图中,各个部门创建独立的基础设施来满足他们的需求。然而,其他部门可能对消费相同的数据感兴趣,这导致需要更复杂的架构来连接各种输入流。让我们看看图1.3,它展示了Kafka事件流平台如何改变这种情况。

image.png

正如您从这个更新的插图中可以看到的,添加Kafka事件流平台大大简化了架构。现在所有组件都将其记录发送到Kafka。此外,消费者从Kafka读取数据,而无需了解生产者。

从高层次来看,Kafka是一个由服务器和客户端组成的分布式系统。服务器称为代理(broker);客户端是向代理发送记录的记录生产者,而消费者客户端读取记录以处理事件。

1.4.1 Kafka代理

与传统消息系统(RabbitMQ或ActiveMQ)中消息是短暂的不同,Kafka代理持久地存储您的记录。代理以字节格式不可知地将数据存储为键值对(以及一些其他元数据字段),对代理来说这些数据有点像黑盒子。

保存事件对于理解消息和事件之间的区别有着更深远的意义。您可以将消息视为两台机器之间的"战术性"通信,而事件代表您不想丢弃的业务关键数据(图1.4)。

image.png

这个插图显示,Kafka代理是Kafka架构中的存储层,位于事件流三部曲的"存储"部分。但除了充当存储层之外,代理还提供其他重要功能,如服务客户端请求和与消费者协调。我们将在第2章详细介绍代理的功能。

1.4.2 Schema Registry(模式注册中心)

数据治理从一开始就至关重要,随着组织规模和多样性的增长,其重要性只会增加。Schema Registry存储事件记录的模式(图1.5)。模式在生产者和消费者之间强制执行数据契约。Schema Registry还提供序列化器和反序列化器,支持不同的Schema Registry感知工具。提供(反)序列化器意味着您不必编写自己的序列化代码。我们将在第3章介绍Schema Registry。附录A中还有一个关于迁移Schema Registry模式的研讨会。

image.png

1.4.3 生产者和消费者客户端

生产者客户端负责将记录发送到Kafka,而消费者负责从Kafka读取记录(图1.6)。这两个客户端构成了创建事件驱动应用程序的基本构建块,它们彼此不可知,从而实现了更大的可扩展性。生产者和消费者客户端也构成了使用Apache Kafka的任何更高级别抽象的基础。我们将在第4章介绍客户端。

image.png

1.4.4 Kafka Connect

Kafka Connect为向Apache Kafka导入数据和从Apache Kafka导出数据提供了生产者和消费者客户端的抽象(图1.7)。Kafka Connect在连接外部数据存储与Apache Kafka方面至关重要。它还提供了在导出或导入数据时使用简单消息转换(SMTs)执行轻量级数据转换的机会。我们将在第5章详细介绍Kafka Connect。

image.png

1.4.5 Kafka Streams

Kafka Streams是Kafka的原生流处理库(图1.8)。Kafka Streams使用Java编程语言编写,由客户端应用程序在Kafka集群的外围使用;它不在Kafka代理内部运行。它支持对事件数据执行操作,包括转换和有状态操作(如连接和聚合)。Kafka Streams是您处理事件时进行核心工作的地方——第6章到第10章将详细介绍Kafka Streams。

image.png

1.4.6 ksqlDB

ksqlDB是一个事件流数据库(图1.9)。它通过为事件流处理应用SQL接口来实现这一点。在底层,ksqlDB使用Kafka Streams来执行其事件流任务。ksqlDB的一个关键优势是它允许您用SQL指定事件流操作;不需要编写代码。我们将在第11章讨论ksqlDB。

image.png

现在我们已经了解了Kafka事件流平台的工作原理,包括各个组件,让我们应用一个零售运营的具体例子来演示Kafka事件流平台是如何工作的。

1.5 应用Kafka事件流平台的具体示例

假设有一位名叫Jane Doe的消费者,她查看了她的电子邮件。有一封来自ZMart的邮件,其中包含一个指向ZMart网站页面的链接,该页面包含一张总购买价格15%折扣的优惠券。进入网页后,Jane点击另一个链接来激活并打印优惠券。虽然整个过程对Jane来说只是另一次在线购买,但对ZMart来说它代表了点击流事件。

让我们暂停场景来讨论这些简单事件之间的关系以及它们如何与Kafka事件流平台交互。最初点击导航到并打印优惠券所生成的数据创建了点击流信息,这些信息通过生产者微服务直接捕获并生产到Kafka中。市场部门启动了一个新的营销活动并想要衡量其有效性,因此这里可用的点击流事件是有价值的。

成功项目的第一个迹象是用户点击电子邮件链接以获取优惠券。数据科学小组也对购买前的点击流数据感兴趣。数据科学团队可以跟踪客户的行为,并将购买归因于那些最初的点击和营销活动。来自这个单一活动的数据量可能看起来很小。但当你考虑到庞大的客户群和几个不同的营销活动时,你就有了大量的数据。

现在,让我们继续我们的购物示例。现在是夏末,Jane一直打算去购物为她的孩子们买返校用品。由于今晚是难得的没有家庭活动的夜晚,她在回家的路上在ZMart停留。

在拿到她需要的所有东西后走过商店时,Jane走过鞋类区,注意到一些新的设计师鞋子,这些鞋子与她的新套装很搭。她意识到这不是她来买的东西,但管它呢?人生苦短(ZMart靠冲动购买而兴旺!),所以Jane买了鞋子。

当Jane到达自助结账通道时,她扫描了她的ZMart会员卡。扫描完所有商品后,她扫描了优惠券,将购买金额减少了15%。然后Jane用她的借记卡支付了交易,拿了收据,走出了商店。当晚晚些时候,Jane查看了她的电子邮件,有一条来自ZMart的消息,感谢她的光顾,并附有新设计师服装系列的折扣优惠券。

让我们剖析购买交易,看看这个事件是否触发了Kafka事件流平台执行的一系列操作。现在ZMart的销售数据流入Kafka。在这种情况下,ZMart使用Kafka Connect创建一个源连接器来捕获发生的销售并将它们发送到Kafka。销售交易带来了第一个要求:保护客户数据。在这种情况下,ZMart使用SMT(简单消息转换)在信用卡数据进入Kafka时对其进行掩码处理(图1.10)。

image.png

当Connect将记录写入Kafka时,ZMart内的不同组织立即消费它们。负责促销的部门创建了一个用于消费销售数据的应用程序,如果客户是忠诚俱乐部会员,则分配购买奖励。如果客户达到获得奖励的门槛,一封带有优惠券的电子邮件就会发送给他们(图1.11)。

image.png

重要的是要注意,ZMart在销售后立即处理销售记录。因此,客户在完成购买后几分钟内就会及时收到带有奖励的电子邮件。在购买事件发生时立即采取行动,使ZMart能够快速响应并向客户提供奖励。

ZMart内的数据科学小组也使用销售数据主题。它使用Kafka Streams应用程序来处理销售数据,建立不同地点客户购买最多商品的购买模式。Kafka Streams应用程序实时处理数据,并将结果发送到销售趋势主题(图1.12)。

image.png

ZMart使用另一个Kafka连接器将销售趋势导出到外部应用程序,该应用程序在仪表板中发布结果。另一个小组也从销售主题消费,以跟踪库存,如果库存低于给定阈值,则订购新商品,这表明需要订购更多这些产品。

此时,您可以看到ZMart如何使用Kafka平台。重要的是要记住,通过事件流方法,ZMart在数据到达时就对其做出响应,使其能够做出快速而高效的决策。另外,请注意,您只写入Kafka一次,但多个小组在不同时间独立地消费它,因此一个小组的活动不会妨碍另一个小组。

总结

  • 事件流捕获从不同来源(如移动设备、客户与网站的交互、在线活动、货运跟踪和业务交易)生成的事件。事件流类似于我们的神经系统。
  • 事件是"发生的某件事",立即做出反应和稍后审查的能力是事件流平台的一个重要概念。
  • Kafka充当您数据的中枢神经系统,简化您的事件流处理架构。
  • Kafka事件流平台通过提供发布/消费、持久存储和处理这三个主要组件,为您提供从头到尾实现事件流应用程序的核心能力。
  • Kafka代理是存储层,为客户端提供写入和读取记录的服务请求。代理将记录存储为字节,不接触或更改内容。
  • Schema Registry提供了一种确保生产者和消费者之间记录兼容性的方法。
  • 生产者客户端向代理写入(生产)记录。消费者客户端从代理消费记录。生产者和消费者客户端彼此不可知。此外,Kafka代理不知道各个客户端是谁;它们只处理请求。
  • Kafka Connect提供了一种集成现有系统的机制,例如用于将数据导入和导出Kafka的外部存储。
  • Kafka Streams是Kafka的原生流处理库。它在Kafka集群的外围运行,而不是在代理内部,并提供对数据转换的支持,包括连接和有状态转换。
  • ksqlDB是Kafka的事件流数据库。它允许您仅用几行SQL就构建健壮的实时系统。