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的两个步骤同时执行的情况

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

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

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

  1. Saga的实现模式——进化(Saga implementation patterns – variations)

    在之前的几个博客中,我主要讲了两个saga的实现模式: 基于command的控制者模式 基于事件的观察者模式 当然,这些都不是实现saga的唯一方式.我们甚至可以将这些结合起来. 发布者——收集者 回 ...

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

    https://lostechies.com/jimmybogard/2013/03/11/saga-implementation-patterns-observer/ 侵删. NServiceBus ...

  3. 《Language Implementation Patterns》之 增强解析模式

    上一章节讲述了基本的语言解析模式,LL(k)足以应付大多数的任务,但是对一些复杂的语言仍然显得不足,已付出更多的复杂度.和运行时效率为代价,我们可以得到能力更强的Parser. Pattern 5 : ...

  4. 局部二值模式(Local Binary Patterns)纹理灰度与旋转不变性

    Multiresolution Gray Scale and Rotation Invariant Texture Classification with Local Binary Patterns, ...

  5. .Net Core自实现CLR异步编程模式(Asynchronous programming patterns)

    最近在看一个线程框架,对.Net的异步编程模型很感兴趣,所以在这里实现CLR定义的异步编程模型,在CLR里有三种异步模式如下,如果不了解的可以详细看MSDN 文档Asynchronous progra ...

  6. Javascript编程模式(JavaScript Programming Patterns)Part 2.(高级篇)

    模块编程模式的启示(Revealing Module Pattern) 客户端对象(Custom Objects) 懒函数定义(Lazy Function Definition) Christian  ...

  7. Javascript编程模式(JavaScript Programming Patterns)Part 1.(初级篇)

    JavaScript 为网站添加状态,这些状态可能是校验或者更复杂的行为像拖拽终止功能或者是异步的请求webserver (aka Ajax). 在过去的那些年里, JavaScript librar ...

  8. 《Language Implementation Patterns》之 解释器

    前面讲述了如何验证语句,这章讲述如何构建一个解释器来执行语句,解释器有两种,高级解释器直接执行语句源码或AST这样的中间结构,低级解释器执行执行字节码(更接近机器指令的形式). 高级解释器比较适合DS ...

  9. 《Language Implementation Patterns》之 强类型规则

    语句的语义取决于其语法结构和相关符号:前者说明了了要"做什么",后者说明了操作"什么对象".所以即使语法结构正确的,如果被操作的对象不合法,语句也是不合法的.语 ...

随机推荐

  1. Cannot read property 'resetFields' of undefined 问题及引申

    问题描述: 使用element开发我的后台系统,编辑和新增使用了同一个弹出框<el-dialog><el-form></el-form></el-dialog ...

  2. DOM读取和修改节点对象属性

    一.获取和修改元素间的内容(3种) 1.innerHTML 获得/设置元素开始标签和结束标签之间的html原文 固定套路:1.删除父元素下所有子元素:parent.innerHTML="&q ...

  3. bootstrap-table不分页时对数值类型数据的排序

    html中的代码 <table id="table"></table> sortData.json的数据如下 [ {"name":&qu ...

  4. 渗透测试中如何科学地使用V*P*N

    环境说明 Windows7 虚拟机,作为VPN网关,负责拨VPN.VPN可以直接OPENVPN,也可以使用ShadowSocks+SSTap. Kali 虚拟机, 渗透测试工作机 配置步骤 Windo ...

  5. CentOS 7 安装python3.6.1

    说明:CentOS 7最小化安装,默认Python 2.7 ,开发需要安装python3.6.1 . 1.检查python版本 [root@bogon ~]# python -VPython 2.7. ...

  6. 让Playground支持UIKit框架

    http://blog.diveinedu.cn/playground_uikit_ios/ 让Playground支持UIKit框架 发表于 作者 排云鹤 — 暂无评论 ↓ Xcode 6新增了Pl ...

  7. TASK_KILLABLE:Linux 中的新进程状态【转】

    转自:https://www.ibm.com/developerworks/cn/linux/l-task-killable/index.html 新的睡眠状态允许 TASK_UNINTERRUPTI ...

  8. Winform 中panel的mousewheel鼠标滚轮事件触发

    如果将窗体或容器控件(如Panel控件)的AutoScroll属性设置为True时,那么当窗体或Panel容不下其中的子控件时就会出现 滚动条,通过移动滚动条可以上下显示出窗体或Panel中的全部内容 ...

  9. python数据类型-----字符串

    今天来总结下python3.4版本字符串的一些操作方法,对这些方法先作一个简单的分类,按照分类来进行总结. Sequence Typessequence类型有六种:strings, byte sequ ...

  10. [ kvm ] 进程的处理器亲和性和vCPU的绑定

    cpu调用进程或线程的方式: Linux内核的进程调度器根据自有的调度策略将系统中的一个进程调度到某个CPU上执行.一个进程在前一个执行时间是在cpuM上运行,而在后一个执行时间则是在cpuN上运行, ...