云计算设计模式(三)——补偿交易模式

云计算设计模式(三)——补偿交易模式

撤消由一系列步骤,它们共同限定了最终一致性操作中,如果一个或多个步骤失败执行的工作。按照最终一致性模型,业务实现复杂的业务流程和工作流的云托管的应用程序中很常见。

背景和问题

在云中运行的应用程序频繁修改数据。此数据可跨在各种地理位置的所保持的数据源的一个品种传播。为了避免争用,并提高在分布式环境中,例如这样的性能,应用程序不应该试图提供强事务一致性。相反,应用程序应该实现最终一致性。在该模型中,一个典型的业务操作由一系列的独立的步骤。而正在执行这些步骤的系统状态的整体图可能是不一致的,但是,当操作完成并且所有步骤都被执行,系统应该重新变得一致。

注意:

数据的一致性提供了入门为什么分布式事务不能很好地扩展更多的信息,并且巩固了最终一致性模型的原则。

在最终一致性模型的一个显著的挑战是如何处理失败无可挽回的一步。在这种情况下,可能需要撤消所有通过的操作中的前面的步骤完成的工作。然而,数据不能简单地被回滚,因为应用程序的其它并发实例可能已经改变,因为它。即使在数据没有被通过一并发实例变更的情况下,撤消一个步骤可能不是简单地恢复原始状态的问题。可能需要应用不同的业务特定的规则(参见实施例部分中描述的旅行网站)。

如果实现最终一致性操作跨越多个异构数据存储,解开在这样的操作中的步骤将需要访问的每个数据存储区中的转弯。在每一个数据存储区执行的工作必须可靠地复原到防止系统其余不一致。

不受实现最终一致性的操作的所有数据可能会在数据库中进行。在面向服务的架构(SOA)环境中的操作可能会调用一个服务动作,并导致由该服务保持状态的变化。要撤消的操作,这种状态的改变也必须是百废待兴。这可能涉及再次调用服务并执行该反转第一的影响另一个动作。

解决方案

落实补偿事务。在一个补偿事务的步骤必须撤消的原始操作的步骤的影响。补偿事务可能无法简单地与国家的制度在运行,因为这种方法可能会覆盖由应用程序的其他并发实例所做的更改开始取代目前的状态。相反,它必须是一个聪明的过程中,考虑到并发情况下进行的任何工作。这个过程通常是应用程序特定的,由原始操作所执行的工作的性质来驱动。

一种常见的方法来实现的,最终一致的操作,需要补偿的是使用的工作流。由于原来的动作的进行,系统记录每个步骤,以及如何通过该步骤完成的工作可以撤消信息。如果操作失败,在任何时候,在工作流倒卷回通过它已经完成的步骤,并执行反转每个步骤的工作。注意,补偿事务可能没有撤消的原始操作的精确镜面相反的顺序工作,并且它可能会执行一些并行撤销步骤。

注意:

这种方法类似于英雄传奇策略。这一战略的描述是克莱门斯Vasters的博客在网上提供。

补偿事务本身是一个最终一致的操作,它也可能会失败。该系统应能够恢复补偿事务在故障点并继续。可能有必要重复发生故障的步骤,所以在补偿事务的步骤应该被定义为幂等的命令。有关幂等的详细信息,请参阅乔纳森·奥利弗的博客幂等模式??。

在某些情况下,可能无法从该已失败,除非通过人工干预的步骤中恢复。在这种情况下,系统应发出警报,并提供尽可能多的信息尽可能了解失败的原因。

问题和注意事项

在决定如何实现这个模式时,请考虑以下几点:

?它可能不容易确定何时在实现最终一致性的动作的步骤已经失败。一个步骤可能不会立即失败,而是它可以阻止。可能有必要实现某种形式的超时机制。

?补偿逻辑不容易推广。补偿事务是特定于应用程序;它依赖于具有足够的信息,以便能够撤消在一个失败的操作的每个步骤的效果的应用。

?您应该定义的步骤在补偿事务的幂等命令。这使得,如果补偿事务本身不能被重复的步骤。

?处理中原始操作的步骤,以及所述补偿事务的基础设施,必须是有弹性的。它一定不能失去,以补偿发生故障的步骤所需要的信息,而且它必须能够可靠地监视补偿逻辑的进度。

?一个补偿事务并不一定在系统中返回数据的状态是在原操作的开始。相反,它补偿了由该成功完成操作失败之前的步骤中执行的工作。

?在补偿事务中的步骤的顺序并不一定是反射镜相反的,在原来的操作的步骤。例如,一个数据存储可以是不一致比另一个更敏感,从而撤消更改到该商店中的补偿事务的步骤应首先发生。

?在完成操作所需的每个资源放置一个短期的基于超时的锁,并提前获得这些资源,可以帮助增加的可能性,整体活动将取得成功。这项工作应执行的所有资源都被收购之后。所有操作必须完成的锁到期之前。

?考虑使用重试逻辑比平常更多的宽容,尽量减少触发补偿事务失败。如果一个操作步骤,实现最终一致性失败,请尝试处理故障为一过性异常,并重复上述步骤。只有放弃操作,如果一个步骤反复或无可挽回地失败,启动补偿事务。

注意:

很多的挑战和实施补偿事务的问题是一样关心实现最终一致性。请参见注意事项实现了数据的一致性入门最终一致性的更多信息。

当使用这个模式

使用此模式仅适用于如果他们失败,必须撤销的操作。如果可能的话,设计解决方案,避免了需要补偿事务的复杂性(有关详细信息,请参阅数据一致性底漆)。

例子

一个旅游网站,使客户预订行程。一个单一的行程可包括一系列航班和酒店的。一位顾客旅行从西雅图到伦敦及巴黎可以创建一个行程时,请执行以下步骤:

1.预订一个座位上的F1航班从西雅图飞往伦敦。

2.预订一个座位上的F2航班从伦敦到巴黎。

3.书本占座F3航班从巴黎飞往西雅图。

4.预订的房间在伦敦酒店H1。

5.预订在巴黎一间客房的酒店H2。

这些步骤构成了最终一致的操作,虽然每一步基本上是在自己的权利单独的原子操作。因此,以及在执行这些步骤时,系统还必须记录必要撤消各以防客户决定取消行程步骤计数器的操作。必要执行计数器操作步骤,然后可以作为一个补偿事务如有必要运行。

请注意,在补偿事务中的步骤可能不是原来的步骤完全相反,并且在补偿事务的每个步骤必须考虑到任何特定于业务的逻辑规则。例如,“unbooking取消预订”座位上的飞行可能不是客户有权向支付任何款项完成退款。

图1 - 生成一个补偿事务撤消一个长时间运行的事务预订旅游行程

Note:

它可能会在并行执行的补偿事务的步骤,这取决于你如何设计每一步的补偿逻辑。

在许多商业解决方案,在单步的故障不总是必要轧制系统背面用补偿事务。例如,具有在旅游网站的情况,客户是无法预订到酒店H1预订航班F1,F2和F3的话,以后,最好是提供客户在同一个城市的房间在不同的酒店而不是取消航班。客户仍然可以选择取消(在这种情况下,补偿事务运行,并撤消作出关于航班F1,F2和F3中的预订),但这个决定应该由客户而不是由系统进行。

本文翻译自MSDN:http://msdn.microsoft.com/en-us/library/dn589804.aspx

时间: 2024-09-30 06:37:42

云计算设计模式(三)——补偿交易模式的相关文章

云计算的设计模式(三)——补偿交易模式

云计算的设计模式(三)--补偿交易模式 撤消由一系列的步骤,它们共同限定了终于一致性操作中,假设一个或多个步骤失败运行的工作.依照终于一致性模型,业务实现复杂的业务流程和工作流的云托管的应用程序中非经常见. 背景和问题 在云中运行的应用程序频繁改动数据. 此数据可跨在各种地理位置的所保持的数据源的一个品种传播. 为了避免争用,并提高在分布式环境中,比如这种性能,应用程序不应该试图提供强事务一致性.相反,应用程序应该实现终于一致性. 在该模型中,一个典型的业务操作由一系列的独立的步骤.而正在运行这

设计模式三—抽象工厂模式

设计模式三-抽象工厂模式 一.定义 抽象工厂模式是工厂方法模式的进一步抽象.如果产品簇中只有一种产品,则退化为工厂方法模式. 二.原理图 三.代码实例 * 苹果和土豆是园丁1的杰作 * 葡萄和西红柿是园丁2的杰作 1.Fruit.java public interface Fruit { /* * 生长 * 收获 * 栽种 */ public void grow(); public void harvest(); public void plant(); } 2.Apple.java publi

初识云计算的三种服务模式 (IaaS SaaS PaaS)

最近公司在使用其他云服务的同时,要封装自己的云服务,下面作为开发产品前的热身,来了解云计算中的三种服务模式,笔者也是从网络上查找,进行综合总结.请拍.. 三种服务模式 根据现在最常用,也就是比较权威的NIST(National Institute of Standard and Technology)美国国家标准技术研究院定义,云计算主要分为三种服务模式,而且这三层的分法重要是从用户体验的角度出发的: IaaS IaaS全拼是Infrastructure as a Service,基础设置即服务

云计算的三种服务模式:IaaS,PaaS和SaaS

你一定听说过云计算中的三个“高大上”的你一定听说过云计算中的三个“高大上”的概念:IaaS.PaaS和SaaS,这几个术语并不好理解.不过,如果你是个吃货,还喜欢披萨,这个问题就好解决了!好吧,其实你根本不是一个吃货,之所以自我标榜为吃货,其实是为了收获赞叹式的夸奖,“吃货还这么瘦,好羡慕啊!”或者,总得给伦家的微丰找个像样的理由. 一个“吃货”是怎样吃到披萨的呢? 1. 在家自己做 这真是个麻烦事,你的准备很多东西,发面.做面团.进烤箱.....简单列一下,需要下图所示的一切: 2. 买好速食

【转】云计算的三种服务模式

“云服务”现在已经快成了一个家喻户晓的词了.如果你不知道PaaS, IaaS 和SaaS的区别,那么也没啥,因为很多人确实不知道. “云”其实是互联网的一个隐喻,“云计算”其实就是使用互联网来接入存储或者运行在远程服务器端的应用,数据,或者服务. 任何一个使用基于互联网的方法来计算,存储和开发的公司,都可以从技术上叫做从事云的公司.然而,不是所有的云公司都一样.不是所有人都是CTO,所以有时候看到云技术背后的一些词可能会比较头疼. 云也是分层的 任何一个在互联网上提供其服务的公司都可以叫做云计算

云计算的三种服务模式IaaS、PaaS和SaaS的差别

详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt363 云服务"现在已经快成了一个家喻户晓的词了.如果你不知道PaaS, IaaS 和SaaS的区别,那么也没啥,因为很多人确实不知道. "云"其实是互联网的一个隐喻,"云计算"其实就是使用互联网来接入存储或者运行在远程服务器端的应用,数据,或者服务. 任何一个使用基于互联网的方法来计算,存储和开发的公司,都可以从技术上叫做从事云的公司

Java经典23结构模型的设计模式(三)------附加代理模式、适配器型号、Facade模式的差异

本文介绍了7样的结构模型中的其余2种:轻量级.代理模式. 一.享元模式FlyWeight 享元模式比較简单且重要,在非常多场合都被用到.仅仅只是封装起来了用户看不到.其概念:运用共享内存技术最大限度的支持大量细粒度的对象. 这个概念给的有些抽象,说白了就是假设内存中存在某个对象A.假设再次须要使用对象A的时候假设内存中有A这个对象就直接使用它,不要再次new了.假设没有,则又一次new一个.基于这个特点,享元模式使用时通常会给待訪问对象传递一个Tag,用来标识这个对象,并且要同一时候使用抽象工厂

设计模式—三种工厂模式(JAVA)

一:简单工厂: 有一个实际工厂,这个工厂只能造一类的产品,这一类产品就是一个产品接口,会有多个具体产品实现这个接口,例 如,一个手机厂,生产苹果手机,三星手机: 缺点:在工厂类中集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中:对系统的维护和扩展不利: 使用场景:负责创建的对象比较少:客户只知道传入工厂类的参数,对于如何创建对象的逻辑不关心:容易违反高内聚责任分配原则,所以只在很简单的情况下应用: package com.designPattern.simp

再战设计模式(三)之建造者模式

建造者模式 他的本质主要是: 分离了组件的构造(由builder来负责),和装配(由Director负责),从而构造出复杂的对象,这个模式使用于:某个对象构建过程复杂的情况下使用 建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象. 由于实现了构建和装配的解耦.不同的构建器和不同的装配器 可以组合成很多不同的对象.也就是实现了构建算法.装配 算法的解耦,实现了更好的复用 场景: 在日常