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的两个步骤同时执行的情况
这方方式也有一些无法避免的缺点:
- 总的处理时间会增加,因为我们使用了一系列的单程步骤
- 伸缩性仍然是一个问题,因为共享了很多实现的状态和队列
Saga的实现模式——控制者(Saga implementation patterns – Controller)的更多相关文章
- Saga的实现模式——进化(Saga implementation patterns – variations)
在之前的几个博客中,我主要讲了两个saga的实现模式: 基于command的控制者模式 基于事件的观察者模式 当然,这些都不是实现saga的唯一方式.我们甚至可以将这些结合起来. 发布者——收集者 回 ...
- Saga的实现模式——观察者(Saga implementation patterns – Observer)
https://lostechies.com/jimmybogard/2013/03/11/saga-implementation-patterns-observer/ 侵删. NServiceBus ...
- 《Language Implementation Patterns》之 增强解析模式
上一章节讲述了基本的语言解析模式,LL(k)足以应付大多数的任务,但是对一些复杂的语言仍然显得不足,已付出更多的复杂度.和运行时效率为代价,我们可以得到能力更强的Parser. Pattern 5 : ...
- 局部二值模式(Local Binary Patterns)纹理灰度与旋转不变性
Multiresolution Gray Scale and Rotation Invariant Texture Classification with Local Binary Patterns, ...
- .Net Core自实现CLR异步编程模式(Asynchronous programming patterns)
最近在看一个线程框架,对.Net的异步编程模型很感兴趣,所以在这里实现CLR定义的异步编程模型,在CLR里有三种异步模式如下,如果不了解的可以详细看MSDN 文档Asynchronous progra ...
- Javascript编程模式(JavaScript Programming Patterns)Part 2.(高级篇)
模块编程模式的启示(Revealing Module Pattern) 客户端对象(Custom Objects) 懒函数定义(Lazy Function Definition) Christian ...
- Javascript编程模式(JavaScript Programming Patterns)Part 1.(初级篇)
JavaScript 为网站添加状态,这些状态可能是校验或者更复杂的行为像拖拽终止功能或者是异步的请求webserver (aka Ajax). 在过去的那些年里, JavaScript librar ...
- 《Language Implementation Patterns》之 解释器
前面讲述了如何验证语句,这章讲述如何构建一个解释器来执行语句,解释器有两种,高级解释器直接执行语句源码或AST这样的中间结构,低级解释器执行执行字节码(更接近机器指令的形式). 高级解释器比较适合DS ...
- 《Language Implementation Patterns》之 强类型规则
语句的语义取决于其语法结构和相关符号:前者说明了了要"做什么",后者说明了操作"什么对象".所以即使语法结构正确的,如果被操作的对象不合法,语句也是不合法的.语 ...
随机推荐
- 记录一次Nginx跳转报错的问题
错误信息如下: An error occurred. Sorry, the page you are looking for is currently unavailable. Please try ...
- JavaWeb中session创建与销毁的问题
今天遇到一个奇怪的问题,自己添加了一个session的监听,用来监听在线的人数.但打开浏览器时一直没有走进这个监听中来.最后百度找到了原因: 我们一直存在一个误区,javaweb中的session什么 ...
- 【Foreign】异色弧 [树状数组]
异色弧 Time Limit: 20 Sec Memory Limit: 256 MB Description Input Output 仅一行一个整数表示答案. Sample Input 8 1 ...
- COGS727 [网络流24题] 太空飞行计划
[问题描述] W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这些实验需要使用的全部仪 ...
- MySql binlog(理论篇)
1.什么是binlog? binlog日志用于记录所有更新了数据的sql语句或保存被修改的记录Row: 有了binlog,可以用于实时备份,master/slave主从同步: 在5.0版本前支持文本格 ...
- php 中foreach比for快之原因
这里首先要谈到php 的hashtabletypedef struct _hashtable { uint nTableSize; // hash Bucket的大小,最小为8,以2x增长. uint ...
- 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)
题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...
- python函数对象和闭包
关于函数对象和闭包 闭包(closure)是函数式编程的重要的语法结构.不同的语言实现闭包的方式不同.Python以函数对象为基础,为闭包这一语法结构提供支持的 (我们在特殊方法与多范式中,已经多次看 ...
- 转:js中javascript:void(0) 真正含义
from:http://www.jb51.net/article/71532.htm 在Javascript中void是一个操作符,该操作符指定要计算一个表达式但是不返回值. 我想使用过ajax的都常 ...
- 转:Python网页解析:BeautifulSoup vs lxml.html
转自:http://www.cnblogs.com/rzhang/archive/2011/12/29/python-html-parsing.html Python里常用的网页解析库有Beautif ...