“事件驱动架构”事件追踪,CQRS,流处理和卡夫卡:什么是关联?-betway体育下载_betway必威手机客户端|必威体育下载欢迎您

事情源作为一种运用程序体系结构形式越来越盛行。事情源触及将运用程序进行的状况更改建模为事情的不可变序列或“日志”。事情源不是在现场修正运用程序的状况,而是将触发状况更改的事情存储在不可变的日志中,并将状况更改建模为对日志中事情的呼应。咱们之前曾写过有关事情源,Apache Kafka及其相关性的文章。在本文中,我将进一步评论这些主意,并展现流处理(尤其是Kafka Streams)怎么协助将事情源和CQRS付诸实践。

让咱们举个比如。考虑一个类似于Facebook的交际网络运用程序(虽然彻底是假定的),当用户更新其Facebook个人资料时会更新个人资料数据库。当用户更新其个人资料时,需求告诉多个运用程序-查找运用程序,以便能够将用户的个人资料从头编制索引以便能够在更改的特色上进行查找;新闻订阅源运用程序,以便用户的联络能够找到有关个人资料更新的信息;数据仓库ETL运用程序将最新的概要文件数据加载到支撑各种剖析查询等的中心数据仓库中。

根据事情源的架构

事情来小萝莉小说源触及更改配置文件Web运用程序,以将配置文件更新建模为事情(发作的重要事情),并将其写入中心日志(例如Kafka主题)。在这种状况下,一切需求呼应配置文件更新事情的运用程序,只需订阅K“事情驱动架构”事情追寻,CQRS,流处理和卡夫卡:什么是相关?-betway体育下载_betway必威手机客户端|必威体育下载欢迎您afka主题并创立各自的物化视图-能够写缓存,在Elasticsearch中为事情树立索引或简略“事情驱动架构”事情追寻,CQRS,流处理和卡夫卡:什么是相关?-betway体育下载_betway必威手机客户端|必威体育下载欢迎您地核算in -内存聚合。个人档案Web运用程序自身也订阅了相同的Kafka主题,并将更新内容写入个人档案数据库。

事情溯源:一些权衡

运用事情源对运用程序进行建模有许多长处-它供给了对目标进行的每个状况更改的完好日志;因而毛病扫除愈加简略。通十三阶魔方过将用户意图表明为不可变事情的有序日志,事情源为企业供给了审阅和合规性日志,这还具有供给数据源的额定长处。它支撑弹性运用程序;回滚运用程序等于后退事情日志和从头处理数据。具有较好的功用特色;写入和读取能够独立缩放。它完成了松懈耦合的运用程序体系结构。它使向根据微服务的体系结构过渡变得更简略。但最重要的是:

事情源支撑构建前向兼容的运用程序消化体系体系结构,行将来能够增加更多需求处理同一事情但创立不同实例化视图的运用程序的才干。

关于上述长处,也有一些缺陷。事情源具有更高的学习曲线;这是一个生疏的新编程模型。事情日志或许触及更多的查询作业,由于它需求将事情转化为合适查询的所需物化状况。

那是对事情源和一些权衡的快速介绍。本文无意评论事情源的细节或发起其用处。您能够在此处阅览有关事情来历和各种折衷办法的更多信息。

Kafka作为事情溯源的支柱

事情源与Apache Kafka相关。这是怎么进行的-事情来历触及保护多个运用程序能够订阅的不可变事情序列。 Kafka是一种高功用,低推迟,可扩展和耐久的日志,已被全球数千家公司运用,并经过了大规模的实战测验。因而,Kafka是存储事情的天然支柱,一同向根据事情源的运用程序体系结构开展。

事情溯源和CQRS

此外,事情源和CQRS运用程序体系结构形式也相关。指令查询职责阻隔(CQRS)是最常用于事情源的运用程序体系结构形式。 CQRS触及在内部将运用程序分为两部分-指令端指令体系更新状况,而查询端则在不更改状况的状况下获取信息。 CQRS供给了关注点别离–指令或写端与事务有关;它不关怀查询,数据上的不同实例化视图,针对功用的实例化视图的最佳菩提树存储等。另一方面,查询或读取端悉数与读取拜访权限有关。其主要意图是使查询快速高效。

Refactoring an application using event sourcing and CQRS

事情源与CQRS一同作业的办法是使应嗜酸性粒细胞用程序的一部分在对事情日志或Kafka主题的写入进程中对更新进行建模。这与事情处理程序配对,该事情处理程序订阅Kafka主题,根据需求转化事情,并将实例化视图写入读取存储。终究,运用程序的读取部分针对读取存储宣布查询。

CQRS具有一些长处-它使负载与写入和读取别离,然后能够别离缩放。各种读取途径自身能够独立缩放。此外,能够针对运用程序的查询形式优化读取存储;图形运用程序能够将Neo4j用作其读取存储,查找运用程序能够运用Lucene索引,而简略的内容服务Web运用程序能够运用嵌入式缓存。除了技术优势之外,CQRS还具有安排上的优势-经过将写入和读取路有备无患是什么意思径别离,您能够使担任写入和读取途径的事务逻辑的团队脱钩。

本文仅触及CQRS细微差别的外表。假如您想了解更多信息,建议阅览Martin Fowler和Udi Dahan关于该主题的文章。

到目前为止,我现已对事情源和CQRS进行了介绍,并描绘了Kafka怎么天然地将这些运用程序架构形式付诸实践。可是,流处理在何处以及怎么进入画面?

CQRS和Kafka的Streams API

这是流处理,尤其是Kaftoptoon漫画ka St女省长reams怎么启用CQRS的办法。事情处理程序订阅事情日志(Kafka主题),运用事情,处理这些事情,并将成果更新运用于读取存储。对事情流进行低推迟转化的进程称为流处理。在Apache Kafka的0.10版别中,社区发布了Kafka Streams。一个强壮的流处理引擎,用于对Kafka主题上的转化进行建模。

Kafka Streams十分合适在运用程序内部构建事情处理程序组件,该运用程序旨在英豪志运用CQRS进行事情来历。它是一个库,因而能够将其嵌入任何规范Java运用程序艳舞女郎中,以对事情流进行转化建模。例如,这是一个运用Kafka Streams进行字数统计的代码片段;您能够在Confluent示例github存储库中拜访整个程序的代码。

KStreamBuilder builder = new “事情驱动架构”事情追寻,CQRS,流处理和卡夫卡:什么是相关?-betway体育下载_betway必威手机客户端|必威体育下载欢迎您KStreamBuilder();

KStream textLines = builder.stream(“事情驱动架构”事情追寻,CQRS,流处理和卡夫卡:什么是相关?-betway体育下载_betway必威手机客户端|必威体育下载欢迎您stringSerde, stringSerde,"TextLinesTopic");

Pattern pattern = Pattern.compile("\\W+", Pattern.UNICODE_CHARACTER_CLASS);

KStream wordCounts = textLines

.flatMapValues(value-> Arrays.asList(pattern.split(value.toLowerCase())))

.map((key, word) -> new KeyValue<>(word, word))

.countByKey("Counts")

.toStream();

wordCounts.to(stringSerde, longSerde, "WordsWithCountsTopic");

KafkaStreams streams = ne两厢车和三厢车的差异w KafkaStreams(builder, streamsConfiguration);

streams.start();

因而,能够轻松地将运用程序内的事情处理程序表明为Kafka Streams拓扑,但更进一步,有两个不同的选项可用于将事情处理程序的输出建模为对运用程序状况进行建模的数据存舞园かりん储的更新。

采纳1:将运用程序状况建模为外部数据存储

Kafka Streams拓扑的输出能够是Kafka主题(如上例所示),也能够写入外部数据存储(如联系数据库)。 从国际的视点来看,事情处理程序建模为Kafka Streams拓扑,而运用程序状况建模为用户信赖和操作的外部数据存储。 履行CQRS的此选项建议运用Kafka Streams仅对事情处理程序建模,而将运用程序状况保留在外部数据存储中,该外部数uniform据存储是Kafka Streams拓扑的终究输出。

以2:在Kafka Streams中将运用程序状况建模为本地状况

作为一种代替办法,除了对事情处理程序进行建模之外,Kafka Streams还供给了一种对运用程序状况进行建模的有用办法-它支撑开箱即用的本地,分区和耐久状况。此本地状况能够是RocksDB存储,也能够是内存中的哈希映射。

运作办法是,将嵌入Kafka Streams库以进行有状况流处理的运用程序的每个实例都保管运用程序状况的子集,建模为状况存储的碎片或分区。状况存储区的分区办法与运用程序的密钥空间相同。成果,服务于抵达特定运用程序实例的查询所需的一切数据在状况存储碎片中本地可用。 Kafka Streams经过通明地将对状况存储所做的一切更新记载到高度可用且耐久的Kafka主题中,来供给对该本地状况存储的容错功用。因而,假如运用程序实例逝世,而且保管的本地状况存储碎片丢掉,则Kafka Streams只需读取高度可用的Kafka主题并将状况数据从头填充即可从头创立状况存储碎片。

实际上,Kafka Streams将Kafka用作其本地嵌入式数据库的提交日志。这正是在封面下规划传统数据库的办法-事务或重做日志是现实的源头,而表仅仅对存储在事务日志中的数据的物化视图。

Kafka Streams中的本地,分区,耐久状况

将Kafka Streams用于运用CQRS构建的有状况运用程序还具有更多优势– Kafka Streams还内置了负载平衡和毛病搬运功用。假如一个运用程序实例失利,则Kafka Streams会主动在其他运用程序实例之间从头分配Kafka主题的分区以及内部状况存储碎片。相同,Kafka Streams答应弹性缩放。假如发动了运用Kafka Streams履行CQRS的运用程序的新实例,它将主动在新发动的运用程序实例之间均匀移动状况存储的现有碎片以及Kafka主题的分区。一切这些功用都以通明的办法供给给Kafka Streams用户。

需求运用Kafka Streams转化为根据CQRS的形式的运用程序不用忧虑运用程序及其状况的容错性,可用性和可伸缩性。

该嵌入式,分区且耐久的状况存储经过Kafka Streams独有的一流笼统-KTable向用户揭露。

Kafka流中的交互式查询

在行将发布的Apache Kafka版别中,Kafka Streams将答应其嵌入式状况存储可查询。

Kafka Streams中的这一共同功用-交互式查询(曾经被Kafka社区称为Queryable State)-也使其合适将CQRS规划形式运用于运用程序。事情处理程序被建模为Kafka Streams拓扑,该拓扑将数据生成到读取存储,该存储不过是Kafka Streams内部的嵌入式状况存储。运用程序的读取部分将StateSto“事情驱动架构”事情追寻,CQRS,流处理和卡夫卡:什么是相关?-betway体育下载_betway必威手机客户端|必威体育下载欢迎您re API用于状况存储,并根据其get()API来供给读取服务。

运用Kafka和Kafka Streams的事情源和根据CQRS的运用程序

Kafka Streams中的交互式查询的状况

请留意,运用交互式查询功用在Kafka Streams中运用嵌入式状况存储纯粹是可选的,并非对一切运用程序都有含义。有时,您只想运用您知道并信赖的外部数据库。或许,在运用Kafka Streams时,您也能够将数据发送到外部数据库(例如Cassandra),并让运用程序的读取部分查询该数据。

可是,何时运用像这样的本地嵌入式运用程序状况才有含义?这里有一些利害考虑-

缺陷

  • 现在生成的运用程序是有状况的,需求多加留意才干进行办理。
  • 它触及远离您知道和信赖的数据存储。

长处

  • 移动的零件更少;仅仅您的运用程序和Kafka集群。您不用布置,保护和操作外部数据库即可存储运用程序所需的状况。
  • 它能够更快,更有用地运用运用程序状况。数据关于您的运用程序是本地的(在内存中或或许在SSD上);您能够快速拜访它。这关于需求拜访很多运用程序状况的运用程序特别有用。而且,在进行聚合以进行流处理的商铺和商铺应对查询之间没有数据重复。“事情驱动架构”事情追寻,CQRS,流处理和卡夫卡:什么是相关?-betway体育下载_betway必威手机客户端|必威体育下载欢迎您
  • 它供给了更好的阻隔;状况在运用程序内。一个歹意运用程序无法吞没其他有状况运用程序同享的中心数据存储。
  • 它具有灵活性。内部运用程序状况能够针对运用程序所需的查询形式进行优化。

运用Kafka做事情溯源和CQRS:大赢家

我上面列出的利害表现了所触及的各种折衷,可是,我以为,朝着此运用程序体系结构跨进的最重要的成功便是运用程序晋级变得愈加简略。处理运用程序的非停机晋级的传统模型(依赖于外部数据库来确认其运用程序状况)适当杂乱。无需停机晋级就不需求一同比亚迪供货商门户运转新版别和旧版别的运用程序。晋级几个实例后,假如发现过错,则需求能够通明地将负载切换回同一运用程序的旧实例。鉴于新实例和旧实例将需求更新外部数据库中的相同表,因而需求分外当心,以在不损坏状况存储中数据的状况下进行此类无停机晋级。

现在,关于依赖于本地嵌入式状况的有状况运用程序,考虑相同的无停机晋级问题。经过此模型,您能够与旧版别一同推出新版别的运用程序(在Kafka Streams中具有不同的运用程序ID)。每个人都具有依照其运用程序事务逻辑版别指示的办法处理的运用程序状况副本。您能够逐渐将流量从旧的引导到新的。假如新版别的某个过错会在运用程序状况存储区中产生意外成果,那么您一直能够将其丢掉,修正该过错,从头布置该运用程序并让其从日志中重建其状况。

放在一同:零售库存运用

现在让咱们以一个比如来阐明怎么将本文介绍的概念付诸实践-怎么运用Kafka和Kafka Streams为运用程序启用事情源和CQRS。

样本零售运用程序体系结构

考虑一个实体零售商的运用程序,该运用程序办理一切商铺的库存; 当新货抵达或发作新出售时,它会更新库存表,而且要知道商铺库存的当时状况,它会查询库存表。

具有事情源的零售运用程序架构—由Kafka供给支撑

假如咱们将事情收购体系结构形式运用于此Inventory运用,则新的货件将在Shipments Kafka主题中表明为事情。 相同,新出售将以Sales Kafka主题(或许由Sales运用程序编写)中的事情表明。 为简略起见,咱们假定“出售”和“发货”主题中的Kafka音讯的关键字是{商铺ID,产品ID},而值是商铺中产品数量的计数。

Inventory运用程序内的事情处理程序被建模为Kafka Streams拓扑,该拓扑衔接了Sales和Shipments Kafka主题。 联接操作创立并更新状况存储库InventoryTable,该状况存储库表明以我的性启蒙教师txt接连办法更新的清单的当时状况。

衔接操作的内部结构以构建库存表

能够将这样的运用程序布置在不同核算机上的多个实例中(如下图所示)。而重生之曼妙医生且,InventoryApp的每个实例都承载InventoryTable的分片的子集,其间包括此联接操作的成果。当用户查询InventoryApp来了解商铺中某产品的当balcony前库存数量时,

  • 运转InventoryApp的随机服务器收到一个恳求:GET / inventory / stores / {store id} / items / {item id} / count
  • 它运用Kafka Streams实例上的metadataForKey()API来获取商铺的StreamsMetadata和密钥。 StreamsMetadata保存Kafka Streams拓扑中每个商铺的主机和端口信息。运用程序运用StreamsMetadata查看该实例是否具有包括关键字{store id,item id}的InventoryTable分区。假如是这样,它将运用本地Kafka Streams实例上的store(“ InventoryTable”)api来获取该商铺并对其进行查询。
  • 假如不是,它将为当时持有包括{store id,item id}的Kafka分区的实例找到主机/端口,并转发GET恳求到/ inventory / stores / {store id} / items / {item id} / count到在该主机上运转的InventoryApp实例。
  • 向用户回来库存盘点

在Kafka Streams中运用交互式查询的InventoryState运用程序

要了解有关“交互式查询”功用的更多信息,请阅览其文档。除了这些资源之外,请参阅Capital One的演示文稿,该演示文稿将在实践中运用本文中介绍的一些思维,并概述运用Kafka Streams的根据REST,事情源,CQRS和呼应流处理的运用程序体系结构。

如上例所示,存储和查询本地状况关于某些有状况运用程序或许没有含义。有时,您“事情驱动架构”事情追寻,CQRS,流处理和卡夫卡:什么是相关?-betway体育下载_betway必威手机客户端|必威体育下载欢迎您想将状况存储在您知道并信赖的外部数据库中。例如,在上面的示例中,您能够运用Kafka Streams经过join操作来核算悬梁刺股的主人公是谁库存数量,但挑选将成果写入外部数据库并查询。

可是,值得留意的是,构建具有查询本地状况的有状况运用程序有许多长处,如本文前面所述。

结论性思维

事情寻源为运用程序运用零丢失协议记载其固有的不可避免的状况改变供给了一种有用的办法。这意味着康复既简略又高效,由于它彻底根据日记或像Kafka这样的有序日志。 CQRS更进一步,将原始事情变成可查询的视图;精心构成的与其他事务流程相关的视图。 Kafka的Streams API供给了以流办法创立这些视图所需的声明性功用,以及可扩展的查询层,因而用户能够直接与此视图进行交互。成果是在Apache Kafka上构建了适用的根据事情源和CQRS的运用程序体系结构;答应此类运用程序还运用Kafka的中心竞争力-功用,可伸缩性,安全性,可靠性和大规模选用。

最重要的是,以这种办法构建有状况的运用程序可使安排终究取得松懈耦合的运用程序体系结构-一种具有弹性和可伸缩性,更易于毛病扫除和晋级的运用程序体系结构,最重要的是,该体系结构具有前向兼容性。

对更多感兴趣?

假如您喜爱本文,则或许需求持续运用以下资源,以了解有关Apache Kafka上流处理的更多信息:

  • 运用Apache Kafka的流SQL引擎KSQL入门,并遵从Stream Processing Cookbook中的各种教程和示例快速入门。
  • 开始运用Kafka Streams API来构建自己的实时运用程序和微服务。
  • 观看咱们的分为三部分的在线讲座系列,了解KSQL怎么作业的来龙去脉,并学习怎么有用地运用它来履行监督,安全性和反常检测,在线数据集成,运用程序开发,流ETL等。
  • 经过Docker阅读有关Kafka Streams API的Confluent教程,并运用咱们的Confluent演示运用程序。

原文:https://www.confluent.io/blog/event-sourcing-cqrs-stream-processing-apache-kafka-whats-connection/

本文:https://pub.inte陈曦lligentx.net/node/788

评论:请参加常识星球或许小红圈【首席架构师圈】

评论(0)