Apache Kafka:针对数据科学家和数据工程师的事件流的隐喻介绍
早在2010年,专业网络站点LinkedIn便在其现有的请求-响应系统上遇到了不一致和延迟问题。为了克服这个问题,公司的软件工程师团队开发了一种优化的消息传递系统,可以解决他们的连续数据流问题。在2010年末,LinkedIn开源了该项目。
2011年7月,Apache Software Foundation将其接受为孵化器项目。因此,诞生了Apache Kafka,后来成为世界上最大的流媒体平台之一。
阿帕奇·卡夫卡
使用Kafka可以捕获实时数据(我们将在稍后进行讨论)。除了Kafka之外,LinkedIn还创建了Samza以实时处理数据流。Apache在2013年将Samza添加到其项目存储库中。
我一直想知道命名工具时Kafka的创作者会想到什么想法。Kafka(与Neha Narkhede和Jun Rao一起)的创始人之一Jay Kreps说:
“我认为,由于Kafka是为写作而优化的系统,因此使用作家的名字是有意义的。我在大学里上了很多照明课,并且喜欢Franz Kafka。加上这个名称对于开源项目来说听起来很酷。
因此,基本上没有什么关系。” (Narkhede,Shapira和Palino,2017年第16页)
卡夫卡对待数据概念的方式与我们对数据的看法完全不同。尽管克雷普斯(Kreps)说的是不要过多地使用该工具的名称是正确的,但我发现20世纪著名文学人物弗朗兹·卡夫卡(Franz Kafka)的著作的哲学基础与Apache Kafka如何处理数据之间存在许多相似之处。
在本文中,我将从Kafka的故事中隐喻一些内容,并与它们进行关联,以了解Apache Kafka的工作原理。
(数据架构的)“变形”
在弗朗兹·卡夫卡(Franz Kafka)的《变形记》(The Metamorphosis)的著名故事中 ,主人公格里戈尔·萨姆萨(Gregor Samsa)早晨醒来,发现自己变成了一只巨大的昆虫。Gregor Samsa的身体发生了物理变化。 《变形记》是一个故事,讲述主角的转变和描述生活荒诞的事件,这仍然是卡夫卡大部分作品的核心思想之一。
您一定想知道这个故事与数据体系结构有什么关系吗?让我解释。
数据作为事件流
传统上,我们将数据视为关于对象的一组值的集合。数据告诉我们实体的当前状态,可以是定性或定量的,例如,客户,产品或经济的某些特征。
直到最近,数据大多存在于称为数据库的整体框架中。如果实体的属性发生更改,我们将更新数据库以反映更改。
因此,传统的关系数据库是可变的,也就是说,要更改其状态,并且一旦更改就保持该状态直到发生任何更新。您可以将更新数据库视为更改数据属性或附加新记录。
但是,在Apache Kafka的世界中,数据不是客观的,而是被视为事件流。事件流以称为主题的日志文件的形式记录。对于初学者来说,日志是一个文件,记录了顺序发生的事件。
可变状态和不可变事件
例如,由customer_id 123标识的客户购买了一个具有product_id 999的产品。在传统的关系数据库中,数量1将与匹配客户ID和产品ID的行相对应地记录,这反映了数据库的当前状态。假设客户改变了主意并购买了三个单位的同一产品。我们需要通过将数量从1更新为3来更改此事务更改的数据库。
但是,如果我们将数据视为事件流,则日志文件会将思想改变反映为事实或在特定时间发生的不变事件。在先前将数量1记录在日志流中之后,日志将追加事件。
Apache Kafka-可变与不可变事件资料来源:Kleppmann,M.(2015)
Apache Kafka的状态性和容错性
回到格里戈尔·萨姆萨(Gregor Samsa)的困境,在特定时间发生的事件导致他的身体发生了转变。但是,他担心上班晚了,因此他的思想仍然完好无损。物理现实的变态是在特定时间点的事件或事实。但是从他的思想仍然像人一样的意义上来说,它也是有状态的。
就像格里高(Gregor)接受身体变化而没有任何惊奇或震惊一样,他的思想根据他的身体需求而改变。甚至对于Apache Kafka中的事件流也是如此。尽管它可以存储一段时间内发生的所有事件,但是您可以选择删除可追溯到较长时间的日志。
保持状态可确保Apache Kafka具有容错能力和弹性,即,如果将来出现任何问题,您始终可以选择返回到先前的工作状态。
实时数据的敏捷响应
大量数据源的出现改变了政府,企业和个人代理商的决策过程。
以前,数据就像是对决策过程进行验证的来源。也就是说,战略决策是本能的和经验性的,然后通过数据进行验证。如今,以数据为依据的决策是流程本身的一部分。因此,我们将数据记录为企业内发生的事件。企业分析这些事件会对其进行操作,并将其用于更多数据作为输出。
“每个字节的数据都有一个故事要讲,重要的事情将告诉下一步要做的事情。为了知道那是什么,我们需要从创建位置到可以分析的位置获取数据。” (Narkhede,Shapira和Palino,2017年第1页)
在这个瞬息万变的面向应用的世界中,数据传输的敏捷性和响应能力至关重要。在内部系统中快速移动数据并响应外部服务器的请求变得势在必行。这是Apache Kafka的pub-sub(发布-订阅)消息传递派上用场的地方。
Apache Kafka中的消息发布-订阅系统
考虑一个示例,其中电子零售商想要为结帐流程构建应用程序,该程序是一个网页或应用程序,购买者可以在其中购买要订购的产品。当客户在线购物并通过网页或应用程序结帐时,购买消息应反映在运输团队的数据上,以将产品运输给购买产品的客户。这不是一个复杂的过程。
现在,考虑一个场景,该事件还应该触发其他事件的系统,例如向客户发送自动电子邮件回执,更新库存数据库等。随着前端和后端服务的添加以及响应列表的增加,随着购买结帐的增长,需要构建更多的集成,这可能会变得过于混乱。集成导致团队间对应用程序的任何更改的依赖性,这使开发变慢。
Apache Kafka-购买订阅流程资料来源:Narkhede,Shapira和Palino(2017)2
Apache Kafka帮助实现系统依赖性的解耦,从而使硬集成消失了。这使结帐网页或应用广播事件,而不是将事件直接转移到其他服务器。这就是我们发布的意思。然后,其他服务(例如库存,货运或电子邮件)订阅该流,从而触发它们相应地采取行动。
发布-订阅模型使用消息传递服务,即,发布者流事件消息,而订阅者选择订阅必需的消息。
购买订阅模型取自
https://www.confluent.io/what-is-apache-kafka/
生产者和消费者
在Apache Kafka中,您可以在指定时间内持久可靠地存储生产者生成的事件流。
它还允许您由使用者读取和处理这些流。 生产者和消费者是完全脱钩的,也就是说,生产者不等待消费者使用事件,消费者可以按任何顺序使用流。使用者还可以选择使用哪些消息。但是,日志将按顺序附加到主题。此属性消除了具有复杂路由规则的复杂性,该规则使Kafka快速,高效,可扩展,并且所有这些都以分布式方式执行。
这让我想起了格雷戈尔·萨姆萨(Gregor Samsa)的身心。萨姆萨(Samsa)想到去上班或直立在昆虫身上。为了为他的身体生存腾出空间,Samsa的家人将家具移出了他的房间。萨姆萨意识到自己的财产被带走了。
通过这些细节,这个故事表明我们的身体生活塑造并指导着我们的精神生活,而不是相反。另外,实时捕获数据的需求使我们将数据视为物理现实而不是事件流。
题库