Sagas中的saga

这个微软官方cqrs系列中讲saga的文章,个人觉得不错,分享给大家。

澄清术语

saga这个术语通常在CQRS中讨论,指的是在边界上下文和聚合之间协调和路由消息的一段代码。然而,出于本指南的目的,我们倾向于使用术语流程管理器(process manager)来指代这种类型的代码。有两个原因:

  • 术语saga有一个众所周知的、预先存在的定义,其含义与一般理解的CQRS相关的定义不同。
  • 流程管理器能更好地描述这种类型的代码的功能角色。

尽管术语saga经常用在CQRS模式的上下文中,但它有一个预先存在的定义。我们在本指南中选择使用术语流程管理器,以避免与这个预先存在的定义混淆。

关于分布式系统的saga一词最初是在Hector Garcia-Molina和Kenneth Salem的论文“Sagas”中定义的。文章提出了一种称为saga的机制,作为使用分布式事务管理长时间运行的业务流程的替代方案。业务流程通常由多个步骤组成,每个步骤都涉及一个事务,并且可以通过将这些单独的事务分组到一个分布式事务中来实现总体的一致性。但是,在长时间运行的业务流程中,使用分布式事务会影响系统的性能和并发性,因为在分布式事务期间必须持有锁。

小提示
saga 概念通过确保业务流程的每个步骤中的事务都有一个已定义的补偿事务,从而消除了对分布式事务的需要。 这样,如果业务流程遇到错误情况而无法继续,它可以为已经完成的步骤执行补偿事务。 这将撤消业务流程中迄今为止已完成的工作,并保持系统的一致性。

尽管我们选择使用术语流程管理器,但是sagas仍然可以在某些边界上下文中实现CQRS模式的系统中发挥作用。通常,您希望看到一个流程管理器在一个有界上下文中的聚合之间路由消息,并且您希望看到一个管理跨多个有界上下文中的长时间运行的业务流程。

接下来的部分我们将描述流程管理器这个术语的含义。这是我们在CQRS项目中使用的定义。

小提示
有一段时间,开发团队在确定流程管理器术语前,他们实现了基于工作流的方式。Gregor Hohpe和Bobby Woolf在《企业集成模式》一书中描述了这种模式。

流程管理器(Process Manager)

本节描述流程管理器的定义。在描述流程管理器之前,先简要回顾一下:CQRS如何使用消息在聚合和边界上下文之间进行通信。

消息(message)和CQRS

当您实现CQRS模式时,通常会考虑两种类型的消息来在系统中传递信息:命令和事件。

命令是命令式的;它们是对系统执行任务或操作的请求。例如,“预定X会议的两个地点”或“把Y发言人安排到z房间”。命令通常只被单个接收者处理一次。

事件是通知;它们通知相关方,并告诉他们已经发生了一些事情。例如,“付款被拒绝”或“创建了X类型的座位”。注意他们如何使用过去时态。事件被发布,并且可能有多个订阅者。

通常,命令是在一个有边界的上下文中发送的。事件的订阅者可以在发布它们的同一个有界上下文中,也可以在其他有界上下文中。

本参考指南中的“A CQRS and ES Deep Dive”一章详细描述了这两种消息类型之间的区别。

什么是流程管理器

在您使用聚合和有界上下文建模的复杂系统中,可能有一些业务流程涉及多个聚合,或在多个有界上下文中的多个聚合。 在这些业务流程中,参与聚合的会有多个不同类型的消息传递和交换。 例如,在会议管理系统中,购买会议座位的业务流程可能涉及订单聚合、预订聚合和支付聚合。 他们必须全部合作才能使客户完成购买。

图1显示了这些聚合为完成订单可能交换的消息的简化视图。数字标识消息顺序。


图1.png

图1,不使用流程管理器的订单处理过程。

在图 1 所示的示例中,每个聚合都向执行流程中的下一步的聚合发送适当的命令。 Order 聚合首先向 Reservation 聚合发送 MakeReservation 命令以保留客户预定的座位。 预订座位后,Reservation 聚合会产生 SeatsReserved 事件以通知 Order 聚合,Order 聚合向 Payment 聚合发送 MakePayment 命令。 如果付款成功,Order 聚合会引发 OrderConfirmed 事件以通知 Reservation 聚合它可以确认座位预订(执行真正的扣减操作),以及告诉用户订单已完成。

图2.png

图2,订单处理使用流程管理器。

图2所示的示例演示了与图1所示相同的业务流程,但这次使用了流程管理器。现在,不是每个聚合直接向其他聚合发送消息,而是由流程管理器来管理中间消息。

这似乎使流程变得复杂:有一个额外的对象(流程管理器)和一些更多的消息。然而,这种方法也有好处。

首先,聚合体不再需要知道流程的下一步是什么。最初,Order聚合需要知道,在进行预订之后,它应该通过向payment聚合发送消息来尝试进行支付。现在,它只需要知道已经创建了一个订单。

其次,消息流的定义现在位于单个位置,即流程管理器,而不是分散在整个聚合中。

在图1和图2所示的简单业务流程中,这些好处是有限的。但是,如果您的业务流程涉及6个聚合和数十条消息,那么好处就会更加明显。如果这是系统中易变的部分,业务流程经常发生更改,这种优势会尤其的明显。

在图3中,为了说明这一点,我们在流程中引入了等待列表。如果客户要求的某些座位无法预订,系统会将这些座位请求添加到等待列表中。要进行此更改,我们修改Reservation聚合,以引发SeatsNotReserved事件来报告有多少座位无法预订,以及SeatsReserved事件报告有多少座位可以预订。然后,进程管理器可以向WaitList聚合发送命令,将未完成的请求列在等待列表中。


图3.png

图3,订单流程中使用流程管理器及等待聚合。

需要注意的是,流程管理器不执行任何业务逻辑。它只路由消息,并且在某些情况下在消息类型之间进行转换。例如,当它接收到一个SeatsNotReserved事件时,它会发送一个AddToWaitList命令。

什么时候使用流程管理器

使用流程管理器有两个关键原因:

  • 当有界上下文使用大量事件和命令时,很难将其作为聚合之间点对点交互的集合进行管理。
  • 当您希望在有界上下文中更容易修改消息路由时。流程管理器给出定义路由的简单方式。

什么时候不使用流程管理器

下面的列表列出了不使用流程管理器的原因:

  • 如果有界上下文包含少量使用有限数量消息的聚合类型,则不应使用流程管理器。
  • 您不应该使用流程管理器来实现域中的任何业务逻辑。业务逻辑属于聚合类型。

原文:https://docs.microsoft.com/en-us/previous-versions/msp-n-p/jj591569(v=pandp.10)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容