我们生活在一个相互连接的世界,”连接“这个词其实在当前数据时代可以说非常的”基础“,无论是大数据,人工智能还是机器人,其实都属于数据处理系统,而连接是让数据能够产生智能的核心。人工智能有两个主要的发展路线,符号注意和连接主义,而连接就是通过大量简单的单元连接,然后经过复杂的计算来产生智能,而这种思想其实就来自于人的大脑结构,人的智能主要通过神经元组成的神经网络产生,那么我们是否可以通过人工的方式来构造神经网络,然后通过输入的输入来最终产生智能?连接在人工智能领域具有举足轻重的地位。
回到我们的日常生活中,我们在优酷上观看视屏,从微信上收到评优的祝福信息以及公众号的推送通知,通过支付宝来支付水电费用,以及给手机账号充值,如果你愿意,可以24小时接收到全球各地的信息实时推送。虽然说这种实时的信息链接交互让我们日常生活更加便利,让我们的生活幸福感更强,但是越来越多的设备和系统也需要相互通信,来形成更加智能的服务提供给最终的用户。由于这种趋势的变化,业务团队也逐步需要处理大量的信息,来提升用户体验,并在市场上保持竞争力。而这些目标达成的核心在于,如何收集散落在企业和客户的不同触点上产生的,企业在运营过程中产生的,以及企业内部管理流程中的数据。而如果你对这些数据进行抽象,你可以看到这些数据有一个明显的特征:已经发生过的操作,决定,事件产生的数据,并且这些数据源源不断的产生,有故事的开头,但是看不到故事的结尾。在数据处理的领域,这种类型的数据有个更形象的名字:事件流数据。我们先从什么是事件流开始聊起。
【什么是事件流?】
简单来说,事件流是数据源产生的事件数据,比如我们的智能手机,用户在企业的电商网站上的操作,下单,物流追踪,以及业务活动都会产生事件数据。事件流这个概念取自于大脑神经系统的研究,我们的电脑时刻都在处理数以万计的信号,并且基于处理结果来指挥身体的器官运作。比如天气太热,温度很高这个信息会传递给大脑,大脑经过处理,会发送信号给相应的器官,通过排汗,口渴来进行协调。特别是人工智能领域,我们说卷积神经模拟了人类大脑的处理机制,那么你有没有考虑过人工智能的本质是什么?是数据吗?是算法吗?其实都不是,对于当前的人工智能发展阶段来说,本质上应该人类的大脑。人类的大脑经过上万年的进化,产生的自我学习的能力,这才是人工智能要逾越的障碍,如何让机器能够自监督学习。
对于人类大脑收到的信号,有些是我们的行为产生的,比如摘有红又大的苹果,而有些是无意识的,比如看到股市大涨,心跳会加速。这些实时产生的信号,或者说事件信息,会被大脑实时处理,并且有些信息会变成记忆,在大脑中持久的保存下来。
对于信息系统来说,这种多个源系统产生的事件信息迅速变成企业日常经营和的核心资产,而能够实时处理这些事件信息的能力已经变成数字化时代企业的分水岭,具备这个能力,就能在数字化时代分得一杯羹,而不具备这种能力,业务会逐步的萎缩,可能生存都会成为问题。
虽然这种说法从表面看有点危言耸听,但是数据能力对企业来说会越来越重要。举个例子,我们的电商平台可以通过实时处理用户购物车操作的事件,来基于历史和实时的数据计算用户获得的折扣信息,来提升转化率;制造型企业流水线上的某个温度传感器的实时监控数据高于平均值,是否会有安全故障?我们通过对这些实时数据进行计算和分析,可以帮助企业提升经营的效率,以及规避潜在的安全隐患。
事件流数据的价值并不仅仅限于实时计算和产生结果,我们也可以将这些事件数据进行持久化,有了这些历史事件数据,我们就可以将系统的状态恢复到任何时刻,来进行问题排查或者系统的状态重建。从这个角度来看,我们的系统的状态其实每时每刻都在发生变化,而驱动系统状态发生变化的就是事件,如果我们将这些事件信息保存起来,那么从初始状态开始,我们其实是可以还原系统的任何时间点的状态。
注:如果你仔细分析关系型数据库,你会发现类如MYSQL的数据日志机制就是时间流,我们对数据库做的CUD操作(注意没有查询,因为查询不会对系统的状态做更新),会写两个日志,一个是redo log,一个是bin log,而日志中记录的就是驱动数据库系统状态变化的事件(日志),比如把表t的id为5的记录年龄+1。
【什么是事件?】
基于对事件流的介绍,你可能会好奇,事件是如何产生呢?我们来列举笔者购买《科学之路》这本书的过程中,会产生哪些事件。因为对这本数期待已久,我们非常期待能尽快收到这本书的中译本,如下图所示:
如上图所示,整个购买过程到收获会在大概6个节点上产生事件,而这些事件按时间顺序排列,就产生了时间流,详细介绍如下:
1,作为天猫的用户,笔者在天猫上购买了《科学之路》这本书,并完成支付,支付完成后,分配的物流信息中包含了物流追踪条形码。
2,商户收到订单,从自己的仓库(比如说浙江仓库)将图书出库,通过菜鸟的物流卡车,将货物运送到机场,物流卡车在装车的时候会记录装车的时间,货品物流追踪码等信息。
3,菜鸟物流卡车达到杭州萧山机场,将图书包裹运送到物流飞机上,并记录图书的物流条形码和时间等信息。
4,飞机从杭州萧山集成飞到广州白云机场,图书包裹被卸下后,重新运送到菜鸟在广州的物流卡车上,目的地是白云区的包裹集散中心,菜鸟会记录包括的装车时间等信息。
5,菜鸟物流卡车达到集散中心,菜鸟的工作人员从卡车上卸载包裹,并扫描物流条形码,记录进入集散中心的时间。
6,菜鸟仓库关系系统会分配快递员,本地快递员拿到包裹,并记录时间,骑电动车派送包裹到齐心路。
7,快递员到目的地后,最后一此扫描包裹的条形码,以及时间,并打电话给云攀,云攀拿到包裹后,就可以开心的学习深度学习的内容了。
从上边购买图书的例子中,笔者特别强调这7个步骤的动作,其实每个步骤都会产生事件,而这些时间按照时间就组成了购买图书这个业务的事件流,而对于用户来讲,我只在天猫上做了下单购买的操作而已。考虑到天猫或者淘宝在国内占据统治地位的电商平台每天的订单量,你大概能测算出来每天会产生多少数量的事件,可以说是数以亿计。
由于我们可以将几乎所有的业务场景通过事件流的方式来建模,但是软件行业没有银弹这个理论可以说放之四海而皆准,因此总有某些业务场景相比其他的场景来说,更加适用于事件流模式,笔者总结如下:
1,系统入侵检测,通过实时的访问流量分析,来检测系统是否被攻破导致敏感数据被窃取。
2,IOT场景,传感器可能被部署安装到各种场合,并且传感器会上报数据给边缘处理节点,因此在边缘节点快速处理传感器上报数据,并实施的发送指令对于IOT项目来说至关重要。
3,金融和证券行业,特别是证券行业,对数据的实时性要求很高,但是股票市场每时每刻都在发生价格的变化,因此股票产生的价格变化事件的数据量会非常大,因此需要机构和证券企业需要有能够处理这种实时股票价格数据流的能力。
4,需要进行数据实时交换的场景,比如电商平台上,订单下单和订单查询通常由不同的存储中间件支持,特别是对于订单查询,我们可以通过OpenSearch或者ElasticSearch这样的组件,来提升全文本检索的能力。但是订单数据在MYQL这样的关系型数据库,我们需要将订单数据(以及更新)准实时的同步到ES来提供订单的全文检索能力,这个时候我们就需要把订单下单以及订单更新这样的事件流,同步到ES。
对于上边提到的场景,如果在时间流的数据中包含了关键的商业数据,业务数据,那么企业就必须有对应的消费应用程序来基于这些事件流来执行对应的动作,接下来,我们来看看,在Kafka这样的平台上,提供了哪些组件,来支持事件流这种设计模式。
注意:虽然说笔者在本文中会强烈推荐事件流架构的应用程序,读者需要注意的是,并不是所有的应用都适合用事件流。笔者最近在某头部航空企业数字化转型项目上,给客户设计了类似的方案,客户问了一个很好的问题,为啥不是用canal(或者DTS)这样的工具来解决数据库到数据库的数据同步,而是使用了消息队列,其实这个问题答案有很多,笔者提这个case的目的是,做技术方案切勿为了技术而技术,方案的核心永远是你解决了什么问题,而不是你用了什么技术,不要本末倒置。
数字化转型的核心其实是数据,我们通过业务中台来更好的将核心业务数据落到数据库,而我们通过数据中台,大数据技术来对输入做深度的分析和攻击,以期能够找到某种规律,来预测业务的发展。而对于企业来说,特别是传统企业来说,信息化给企业带来的是每个部门都有自己的系统,甚至有些部门通过Excel的开发构建出来一套管理系统。而很不幸的是,这些不同的系统之间并没有连接,相互形成孤岛,因此企业的核心业务数据也就散落在不同的地方。
如果企业的数据都在同一个数据库中,那么事件流的这种模式对你来说没有太大的价值,但是当今大部分企业都会有多个系统,比如笔者当前负责的航空类企业,光订单系统都有好几个,那么如何将散落在各处的核心业务数据进行整合,给下游系统提供一致的数据视图,从系统长期建设的角度以及数字化转型的角度,显得特别重要。
【事件流平台Kafka】
Kafka是一款开源的消息处理引擎,通常我们称之为消息中间件,与之齐名的还有阿里巴巴开源的RocketMQ。Kafka除了提供消息中间件所必须的消息发送,Borker,分区,消费者端,高可用和高可靠等机制外,还提供了事件流模式所需要的核心组件和能力。站在事件流模式的角度,我们可以把Kafka提供的能力分为三类:1,消息的发布和订阅模式;2,持久化存储机制;3,消息处理引擎。而这种持久化存储和数据处理的能力,让Kafka迅速成为企业数据的统一处理平台。在介绍Kafka作为企业统一数据处理平台之前,我们先来看几个例子,让大家对统一数据处理平台在企业的核心系统中的位置和作用有直观的了解。
我们先来看看如果企业的核心数据没有统一来处理,会是什么样子,如下图所示:
如上图所示,企业的不同业务团队根据自己的实际情况,将业务数据持久化保存在自己的数据库,但是这些数据对于企业的数据分析部门来说,需要访问所有的数据,因此我们可以看到消费者端需要连接不同的消息队列来获取数据分析所需要的数据。接下来,我们来看看采用了Kafka事件流组件后的系统架构图,如下所示:
从上图可以看到,系统引入了Kafka事件流组件后,整个架构变得更加清晰,所有事件流数据的生产者现在只需要将数据发送到Kafka,而这些数据的消费者只需要注册到对应的主题,不用关心这些消息是谁生产的。从Kafka体系结构来看,Kafka是一套分布式的系统,由客户端和服务器端组成,服务器端也叫Broker,客户端负责生产和消费事件数据。接下来我们分别介绍一下Kafka的核心组件以及事件流组件。
【Kafka Broker】
Broker的最主要的工作就是持久化生产者客户端发送的消息数据,消息被按照key-value的格式进行存储。由于消息是以字节码的格式被保存在磁盘上,因此这些消息数据对于Broker来说就如同黑盒子,因为Broker其实也不知道消息中具体有什么内容,并且Borker也不关心。
通常情况下为了确保数据的高可用,Broker会部署成集群,并且数据会在集群中进行复制,来提供可靠性。Broker除了提供数据存储和高可靠之外,还有其他重要的功能,比如消费者组的协调者,点位管理等,笔者会在后续的文章中详细介绍,大家稍安勿躁。
【Schema registry】
基于消息队列通信的两个系统,消息格式非常重要,因为消息格式就如同两个做生意实体签订的合同,业务往来必须按照约定的模式进行。而Schema在消费者端和生产者端建立了这种约束。Kafka的Sechema Registry机制为生产者端和消费者端提供Schema管理,版本控制,序列化和反序列等机制,来加速基于事件流模式的应用落地实施。
【Kafka Connect】
Kafka Connect基于客户端对象模型进行了抽象,来提供Kafka数据的接入和输出的能力。Connect是和外部数据源集成的核心,并且提供了轻量级的数据转换机制。如下图所示:
【Kafka Streams】
Kafka Streams是一套原生的流数据处理框架,Streams框架基于Java语言编写。Streams组件并不是运行在Broker上,提供了事件数据的操作,包括数据转换的能力,以及数据连接和聚合操作。从这个角度看,我们的大部分工作都将会集中在Streams组件上。
【Kafka ksqlDB】
ksqlDB是一套事件流持久化数据库,并对事件流数据提供了类SQL的查询接口,从具体实现的角度来看,ksqlDB使用Kafka Streams来进行事件流数据的各种操作。ksqlDB最大的优势就是提供了一套类SQL的查询接口,让熟悉关系型数据的业务人员可以无缝切换到流数据的分析场景。比如我们编写如下的语句:
CREATE TABLE activePromotions AS SELECT id, qualifyPromotion AS promotion FROM locations GROUP BY id EMIT CHANGES;
在了解了Kafka和Streams组件之后,我们来通过一个真实的例子来看看,这些组件是如何集成在一起最终组成一个事件流处理系统。
用户小Q是xx电商平台的忠实的客户,有一天小Q在自己的邮箱里收到了xx电商平台发送的15%的折扣卷,小Q点击邮件中的领取连接,通过一系列操作之后,小Q领取了优惠券并激活,优惠券就出现在了小Q的账户上,小Q就可以使用这个15%的优惠券来购买日常用品。这看似稀松平常的操作,其实有一系列的事件在后台产生,我们来详细的分析一下。
小Q在点击优惠券领取连接的时候,会产生点击事件,事件信息会被发送到Kafka消息中间件上,虽然说小Q的这个操作并没有购买的行为,但是这些数据对于市场和营销的同学来说非常重要,只要用户点击了这个链接,那么用户就有购买的预期,营销部门可以基于这个数据来进行后续的营销活动。小Q拥有了这张优惠券之后,刚好到了九月快开学的季节,小Q需要给两个女儿购买学习用品。小Q登陆到xx电商平台,精挑细选之后,小Q在checkout之前,发现鸿星尔克运动鞋有新款,在特殊的时期,支持国产是不错的选择,小Q选择了自己满意的款式,然后进入checkout页面并勾选了之前的优惠券,待支付金额瞬间扣减了15%,小Q通过支付宝支付了应付金额。
小Q刚支付完订单不一会,小Q突然听到叮的一声,有一张从xx电商平台来的感谢信,感谢了小Q支持国货之外,提供了另外一张购买运动服的优惠券。真个业务流程背后扒开来看,购买行为会产生一系列的事件并发送给Kafka事件流平台。不出所料,xx电商平台使用Connect数据源连接组件来从源系统获取销售数据,并且为了遵守国家个人信息法案,xx电商使用了SMT(Simple Message Transform)组件来将敏感的个人数据在进入到Kafka之前,先进行掩码处理,如下图所示:
随着数据源组件connect将数据写入到Kafka,数据会立即会被不同的消费者组消费,负责优惠券的部门读取到小Q的购买记录后,基于小Q过往消费历史,算法决定为小Q赠送一张购买运动服的优惠券,来奖励小Q对平台的忠诚度。因此优惠券通过邮件发送给小Q。这里需要注意的是,xx电商平台会在小Q支付订单之后,立即处理这条购买数据,因此客户会在极短的时间内获收到优惠券奖励。大数据分析团队也订阅了用户订单数据主题,这个团队主要是利用用户的购买记录来构建用户的购买模型,来预测未来几个月的促销和商品目录,Kafka Streams对数据进行了处理之后,发给sales-trends主题,如下图所示:
xx电商平台使用另外一个Kafka connector来将预处理后的销售数据发送给外部数据分析系统,比如说ES,而ES中的销售数据可以通过Kibana来进行可视化分析和展示。从上边关于xx电商平台基于Kafka平台构建的统一销售数据处理平台的案例,希望大家能体会到通过Kafka来进行数据的统一收集,下游的多个系统可以针对销售数据马上进行处理,并且如果我们有一个新的业务需要基于销售处理,唯一要做的就是接入到Kafka,然后开始业务逻辑的开发,整个系统的扩展性非常灵活。
笔者会在后续的文章中详细介绍时间流驱动的应用程序设计和开发,以及如何依赖Kafka提供的事件流平台来构建稳定和可靠的应用程序。好了,今天的内容就这么多了,下一篇我们来详细介绍一下Kafka Broker的工作原理,敬请期待!