Saga的实现模式——控制者(Saga implementation patterns – Controller)

https://lostechies.com/jimmybogard/2013/03/14/saga-implementation-patterns-controller/

之前的文章中我们介绍了观察者模式。在这个模式里,saga在整个业务中是一个被动的参与者,和大多数快餐店完成订单流程类似。但是并不是所有的快餐店都用这种方式,还有更多的更有效率的方式能够完成这种工作。

我们可以让我们的saga在整个业务过程中扮演一个主动的角色。saga直接控制整个流程,向特定的工作者发出command,等待回复,然后跳转到下一个步骤。这种方式在某个业务顺序确定的流程中可以工作得很好:

我们的saga有一个特定的顺序,在经过一定的时间,步骤之后,saga需要从前面的步骤获取相应的信息。为了实现一个订单,我们必须能够控制整个流程。在付款前我们不能运送货物,订单没有生成我们不能完成付款,等等。

和观察者saga不一样,控制者saga通过发布command或者根据反馈来引导整个工作流,决定是否进入下一步。如果一个步骤因失败或者接到一个错误信息反馈而返回,我们就可以进入一个其他的工作流中。我们可以使用修正操作(compensating actions)或者进入其他手动控制的流程里。

这里的关键是控制者saga发布command,而观察者saga收集事件。就像观察者saga一样,我们可以再次观察食品加工过程来看控制者saga在实际中对应的例子。

快餐的消息传递——Which Wich三明治店

尽管我们的麦当劳例子中的每个步骤的执行都可以是并行的,没有任何的合作和相互依赖,但是我们当地的三明治店就使用了完全相反的方式。在这个商店中,整个流程就是一个单一的通道:

我们的客人通过下一个订单开始整个流程。在Which Wich,用一种很巧妙地方式实现下订单。客户选一个标有主要配料的纸袋。在这个纸袋上有一个配料表,客户勾选配料表来选择他们想要在三明治里面加什么。最后客户在纸袋上写上名字——这样加工三明治的人就知道他们的三明治要给谁,订单就完成了。

一条铁丝穿越了整家店,然后你的纸袋就挂在上,店员就会按照处流程顺序把你的纸袋顺着铁丝滑到下一个工作台。

铁丝并不是我们例子中的“非常”核心的控制者——我们并没有一个负责协调整个通道的员工。而整个协调过程就是整个队列的内在顺序。如果我们想要在真实世界餐厅里面找到我们想要的控制者角色,我们就需要举一家高端的有专门的人负责管理流程的快餐店的例子——但是我可不想让这个事实妨碍我们的例子。

这种方式有一些优点:

  • 每一个步骤的顺序都很清晰,互相关联
  • 没有任何的资源竞争,因为不存在同一个saga的两个步骤同时执行的情况

这方方式也有一些无法避免的缺点:

  • 总的处理时间会增加,因为我们使用了一系列的单程步骤
  • 伸缩性仍然是一个问题,因为共享了很多实现的状态和队列
时间: 2024-10-03 22:25:36

Saga的实现模式——控制者(Saga implementation patterns – Controller)的相关文章

Saga的实现模式——观察者(Saga implementation patterns – Observer)

https://lostechies.com/jimmybogard/2013/03/11/saga-implementation-patterns-observer/ 侵删. NServiceBus sagas 是一个Process Manager pattern的实现,在实现的时候经常使用它的一两种主要形式.虽然各有差别,但总的来说saga的实现也就总是那几种. 第一种是观察者模式.作为一个观察者,saga通过响应事件来协调业务: 观察者有一些特性: 消息以事件的形式接收 saga并不控制消

Javascript编程模式(JavaScript Programming Patterns)Part 1.

JavaScript 为网站添加状态,这些状态可能是校验或者更复杂的行为像拖拽终止功能或者是异步的请求webserver (aka Ajax). 在过去的那些年里, JavaScript libraries变得越来越流行. 如果你面对着很多的工作计划,一个很明确的道理就是在网站变得越来越复杂的情况下每次修改‘轮子“肯定让你不爽.当然我们把类库放到一边,聚焦于 JavaScript的语法,对你最有价值的东西是在你编写 JavaScript你要明确你使用的是那种”编程模式“. 下面主要介绍几个jav

saga中的saga(A Saga on Sagas)

此文翻译自msdn,侵删. 原文地址:https://msdn.microsoft.com/en-us/library/jj591569.aspx Process Managers, Coordinating Workflows, and Sagas 分清术语 saga这个名词通常被用在CQRS的讨论中,它是指一段在限定上下文(bounded contexts )和聚合(aggregates)之间起协作和路由(coordinates and routes )消息作用的代码.然而,在这个指南中我们

[转帖]如何选择分布式事务形态(Fescar、TCC、SAGA、补偿、基于消息的最终一致

如何选择分布式事务形态(Fescar.TCC.SAGA.补偿.基于消息的最终一致 https://blog.csdn.net/zhangjunli/article/details/100015236 各种形态的分布式事务分布式事务有多种主流形态,包括: 基于消息实现的分布式事务基于补偿实现的分布式事务基于TCC实现的分布式事务基于SAGA实现的分布式事务基于2PC实现的分布式事务这些形态的原理已经在很多文章中进行了剖析,用“分布式事务”关键字就能搜到对应的文章,本文不再赘述这些形态的原理,并将重

元素模式是单一关系的表现,是设计模式不可再分的最小单元

当我们在软件设计中想应用设计模式时,往往是凭借设计模式的名字和需求有点类似,之后就尝试着将模式生搬硬套到其中.而真正去理解设计模式往往变得比较困难,很多书籍也仅仅是用不同方法来降低模式记忆的强度.难道设计模式不能从更加细微的层面去理解吗?当然可以,设计模式就像可以再分解的化合物一般是可在分解,这种再分解后的模式叫做元素模式(elemental design patterns , EDP). 元素模式重申了一个非常重要的思想:模式是概念,而不是结构.GoF也这样认为:"假设某语言是面向过程的语言,

架构模式: 领域事件

架构模式: 领域事件 来自领域驱动设计(DDD). 上下文 服务通常需要在更新其数据时发布事件.例如,可能需要这些事件来更新CQRS视图.或者,该服务可能参与基于 choreography-based saga编排,并使用事件进行协调. 问题 服务在更新数据时如何发布事件? 解决方案 将服务的业务逻辑组织为DDD聚合的集合,这些聚合在创建或更新时发出域事件.该服务发布这些域事件,以便其他服务可以使用它们. 关联模式 Saga和CQRS模式创造了对这种模式的需求 Aggregate模式用于构建业务

提高C++编译速度-------pimpl 模式& 桥接模式(转)

pimpl 模式(Private Implementation),我们常常听到诸如“不要改动你的公有接口”这样的建议,所以我们一般都会修改私有接口,但是这会导致包含该头文件的所有源文件都要重新编译,这会是个麻烦事儿.Pimpl机制,顾名思义,将实现私有化,力图使得头文件对改变不透明. 桥接模式(bridge)是一种结构型设计模式,它把类的具体实现细节对用户隐藏起来,以达到类之间的最小耦合关系.在具体编程实践中桥接模式也被称为pimpl或者handle/body惯用法,它可以将头文件的依赖关系降到

实际案例讲解iOS设计模式——MVC模式

MVC模式是iOS编程中提到的最多次的设计模式,也是使用最频繁的设计模式之一.网络上有很多的MVC模式的分析文章,但都是从原理上来解释,很少能找到配套的案例来说明到底在实际的项目中要如何的使用这种模式.小编在经过详细的研究.对比和实验了之后,总结了一下这个模式的一些简单使用方法,希望能起一个抛砖引玉的作用,使得对MVC默认的同学能依葫芦画瓢的了解MVC模式的使用方法,并以此类推出更多.更好的方法出来. 这篇文章先从老生常谈的MVC设计模式的原理说起,然后配上一个简单的案例,以演示如何将一个常规的

设计模式(二) 模式语录

设计模式--模式语录 <Design Patterns:Elements of Reusable Object-Oriented Software>尽管是英文描述的,了解和喜欢设计模式的同仁看到这个书目,熟悉得犹如看到下面这张图: 当你发现这不是一张完整的图的时候,不要以为被我忽悠了,即便你是被我善意地小小忽悠了一下,但你忽悠不了你自己(GOF的设计模式),很快其他部分自然而然的在你脑海里呈现出来.如果说你还没有打算现在或者将来去学习和使用设计模式来改善自己的编码和设计,请你不要觉得我在故弄玄