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. [目前未找到题目]扩展KMP模板

    procedure build_next; begin lena:=length(a);lenb:=length(b); next[]:=lenb;next[]:=lenb-; to lenb- ] ...

  2. Python学习笔记 - day5 - 文件操作

    Python文件操作 读写文件是最常见的IO操作,在磁盘上读写文件的功能都是由操作系统提供的,操作系统不允许普通的程序直接操作磁盘(大部分程序都需要间接的通过操作系统来完成对硬件的操作),所以,读写文 ...

  3. linux驱动学习(八) i2c驱动架构(史上最全) davinc dm368 i2c驱动分析【转】

    转自:http://blog.csdn.net/ghostyu/article/details/8094049 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 预备知识 lin ...

  4. appium===Python+Appium环境部署教程

    *前提是你已经安装好python,以及python的pip工具 *安装python请自行百度教程~ 1.安装安卓sdk 安装包:http://tools.android-studio.org/inde ...

  5. js中给easyui的一列添加按钮

    $("#totalTb").datagrid({ columns: [[                { field: 'ENTITY_ACTNAME', title: '活动名 ...

  6. struts标签include传参的问题

    传一个常量过去居然为null, <s:include value="/biz/customer/corp/module/franchisemanageright/corpFranchi ...

  7. 1.kafka的介绍

    kafka是一种高可用,高吞吐量,基于zookeeper协调的分布式发布订阅消息系统. 消息中间件:生产者和消费者 举个例子: 生产者:做馒头,消费者:吃馒头,数据流:馒头 如果消费者宕机了,吃不下去 ...

  8. Grunt环境搭建及使用 前端必备

    jQuery在使用grunt,bootstrap在使用grunt,百度UEditor在使用grunt,你没有理由不学.不用! 1. 前言 各位web前端开发人员,如果你现在还不知道grunt或者听说过 ...

  9. 《Java编程思想》笔记 第二十章 注解

    1.注解 注解也称元数据,是在代码中添加信息的一种方式添加的信息提供给编译器或者工具类框架使用. SE5引入,可以提供用来完整描述程序所需要的信息,往往这些信息是无法用Java来表达的. 注解可以在编 ...

  10. 驱动模块和装模块的概念——Junit单元测试案例

    驱动模块是用来模拟被测试模块的上一级模块,相当于被测模块的主程序.它接收数据,将相关数据传送给被测模块,启用被测模块,并打印出相应的结果. 桩模块(Stub)是指模拟被测试的模块所调用的模块,而不是软 ...