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

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

背景和问题

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

注意

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

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

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

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

解决方案

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

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

注意

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

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

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

问题和注意事项

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

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

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

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

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

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

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

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

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

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

当使用这个模式

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

例子

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

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

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

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

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

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

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

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

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

Note

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

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

相关文章: 

  • 云计算设计模式(一)缓存预留模式

  • 云计算设计模式(二)——断路器模式

原文地址:http://blog.csdn.net/yangzhenping/article/details/40786663


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java反射 修改静态方法的值 setAccessible

转载自 java反射 修改静态方法的值 setAccessible 这几天闲来无事。在网上看了一个题目,相信大家都知道这个题目 static void change(String str){str"welcome";}public static void main(String[] args) {String str "123";change(str);Syste…

mybatis简单案例源码详细【注释全面】——实体层(User.java)

/** * Title: Users.java * Package org.entity * Description: TODO该方法的主要作用: * author A18ccms A18ccms_gmail_com * date 2017-10-5 下午6:53:06 * version V1.0 */ package org.entity;import java.util.Date;/** * * 项目名称:s…

API网关Ocelot 使用Polly 处理部分失败问题

在实现API Gateway过程中,另外一个需要考虑的问题就是部分失败。这个问题发生在分布式系统中当一个服务调用另外一个服务超时或者不可用的情况。API Gateway不应该被阻断并处于无限期等待下游服务的状态。但是,如何处理这种失败依赖于特定的场景和具体服…

数组模拟环形队列

思路分析 代码实现 package com.atguigu.queue;import java.util.Calendar; import java.util.Scanner;/*** 创建人 wdl* 创建时间 2021/3/17* 描述*/ public class CircleArrayQueueDemo {public static void main(String[] args) {//测试一把System.out.println("测试数…

Error:(1, 10) java: 需要class, interface或enum

https://blog.csdn.net/zf18234031156/article/details/103047649 反复做这一步,30多个文件一个一个弄,有乱码用txt打开,黏贴覆盖, 目录 1.前言 2.原因(UTF-8BOM造成) 3.如何解决 3.11使用Notepad,选择“格式--以…

彻底理解ThreadLocal

转载自 彻底理解ThreadLocal 先总述,后分析 深挖过threadLocal之后,一句话概括:Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。所以ThreadLocal的应用场合,最适合的是按线程多实例&#xff…

mybatis简单案例源码详细【注释全面】——实体层(Role.java)

package org.entity;import java.util.Date; /*** * * 项目名称:ssm_chop2 * 类名称:Role * 类描述: 角色表的实体类 * 创建人:Mu Xiongxiong * 创建时间:2017-10-7 上午10:01:31 * 修改人&#xff…

IDEA导入Eclipse项目

https://blog.csdn.net/zeal9s/article/details/90690524 背景:用习惯了idea再去用eclipse实在用的不习惯,于是将老的eclipse项目导入到eclipse,网上有很多教程,看了很多博客都不行,一直报错,各种报错&…

云计算设计模式(四)——消费者的竞争模式

允许多个并发用户处理在同一个通讯通道接收的消息。这种模式使系统能够同时处理多个邮件,以优化吞吐量,提高可扩展性和可用性,以及平衡工作负载。 背景和问题 在云中运行的应用程序,可以预计,以处理大量的请求。而不是…

带头单链表有序版

package com.atguigu.linkedlist;/*** 创建人 wdl* 创建时间 2021/3/17* 描述*/ public class SingleLinkedListDemo {public static void main(String[] args) {//进行测试//先创建节点HeroNode hearo1 new HeroNode(1, "宋江", "及时雨");HeroNode hear…

mybatis简单案例源码详细【注释全面】——Dao层接口(UserMapper.java)

/** * Title: IUserDao.java * Package org.dao * Description: TODO该方法的主要作用: * author A18ccms A18ccms_gmail_com * date 2017-10-5 下午8:59:34 * version V1.0 */ package org.dao;import java.util.Date; import java.util.List; import java.u…

java笔记--关于线程同步(7种同步方式)

转载自 java笔记--关于线程同步(7种同步方式) 为何要使用同步? java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 将会导致数据不准确&#xf…

前后端分离趋势谈

最近已经不止一个人和我提起过vue了,在我的前端印象中,我还停留在smarty渲染模版,jquery做js处理。学了一晚上,对现在这种工程化webpack打包生成html,js,css的生产方式越来越有兴趣了。工作年限摆在这里的好…

mybatis简单案例源码详细【注释全面】——Dao层映射文件(UserMapper.xml)【重要】

<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace"org.dao.UserMapper"><…

from + size must be less than or equal to: [10000] but was [10550]

from size must be less than or equal to: [10000] but was [10550]_绅士jiejie的博客-CSDN博客 以上错误是ElasticSearch分页搜索时出现的&#xff0c;这是因为ES默认支持的最大条数就是10000条&#xff0c;深度分页导致总条数超过10000&#xff0c;就会报这个错。 解决方…

java并发编程之4——Java锁分解锁分段技术

转载自 java并发编程之4——Java锁分解锁分段技术 并发编程的所有问题&#xff0c;最后都转换成了&#xff0c;“有状态bean”的状态的同步与互斥修改问题。而最后提出的解决“有状态bean”的同步与互斥修改问题的方案是为所有修改这个状态的方法都加上锁&#xff0c;这样也就可…

云计算设计模式(五)——计算资源整合模式

合并多个任务或操作成一个单一的计算单元。这种模式可以提高计算资源的利用率&#xff0c;并降低与云托管的应用程序进行计算处理相关的成本和管理开销。 背景和问题 云应用程序频繁执行各种操作。在某些解决方案也可能是有意义的最初遵循的关注点分离的设计原则&#xff0c;并…

stream获取filter

Java集合Stream类filter的使用_黄嘉成的博客-CSDN博客 Java集合Stream类filter的使用 黄嘉成 2018-05-11 11:49:42 242767 收藏 116 分类专栏&#xff1a; Java高级编程 文章标签&#xff1a; java 集合 Stream filter 过滤 版权 Java高级编程 专栏收录该内容 4 篇文章0 订…

MySQL数据库开发的 36 条军规

转载自 MySQL数据库开发的 36 条军规 核心军规 尽量不在数据库做运算 控制单表数据量 纯INT不超过10M条&#xff0c;含Char不超过5M条 保持表身段苗条 平衡范式和冗余 拒绝大SQL&#xff0c;复杂事务&#xff0c;大批量任务 字段类军规 用好数值字段&#xff0c;尽量简化…