分布式事务解决方案——柔性事务与服务模式

author author     2023-01-12     522

关键词:

在分布式系统中,是无法使用本地事务保证数据的一致性的。一种标准的分布式事务就是全局事务(DTP模型)。他是基于2PC来控制的。但是由于2PC自身就存在同步阻塞的问题,这也就导致全局事务效率很低。所以,这种全局事务并不适合解决大型网站的分布式事务问题。

柔性事务
在业内,主要用来解决分布式事务的方案是使用柔性事务。所谓柔性事务,相比较与数据库事务中的ACID这种刚性事务来说,柔性事务保证的事“基本可用,最终一致。”这其实就是基于BASE理论,保证数据的最终一致性。

虽然柔性事务并不像刚性事务那样完全遵循ACID,但是,也是部分遵循ACID的,简单看一下关于ACID四个属性,柔性事务的支撑程度:

原子性:严格遵循

一致性:事务完成后的一致性严格遵循;事务中的一致性可适当放宽

隔离性:并行事务间不可影响;事务中间结果可见性允许安全放宽

持久性:严格遵循

柔性事务的基础
前面介绍过了柔性事务的定义,目前,在业内,关于柔性事务,最主要的有以下三种类型:异步确保型、补偿型、最大努力通知型。

这三种类型的柔性事务基本都有对应的实现,不同的场景需要使用不同的柔性事务类型。而这几种柔性事务类型,其实还是依赖一些基础模式的,或者叫做基础接口,基础功能。

比如,要想使用可靠消息最终一致来实现异步确保型柔性事务,就依赖接幂等操作和可查询操作。关于具体实现,我们在后面的文章中介绍,本文简单介绍下这些实现柔性事务依赖的基础模式。

注意,下面要介绍的柔性事务的模式,并不是柔性事务的方案。这些是做柔性事务的基础。也就是说,如果你想做柔性事务,你的接口和功能要满足下面的几个要求。不一定要都满足,因为不同的方案的要求不一样。但是都不满足的话,是不可能做柔性事务的。

可查询操作
可查询操作,几乎是所有的分布式解决方案都需要的。

举一个常见的分布式场景的例子,如订单处理这一功能

/ 支付订单处理 /
public void completeOrder()
orderDao.update(); // 订单服务本地更新订单状态
accountService.update(); // 调用资金账户服务给资金帐户加款
pointService.update(); // 调用积分服务给积分帐户增加积分
accountingService.insert(); // 调用会计服务向会计系统写入会计原始凭证
merchantNotifyService.notify(); // 调用商户通知服务向商户发送支付结果通知

以上这个支付订单处理的例子中,除了订单服务本地更新订单状态以外的所有操作,都需要调用RPC接口来执行,这种情况单纯的本地事务就无法保证数据的一致性了。就需要引入分布式事务。在分布式事务执行过程中,如果某一个步骤执行出错,就需要明确的知道其他几个操作的处理情况,这就需要其他的服务都能够提供查询接口,保证可以通过查询来判断操作的处理情况。
技术分享图片
为了保证操作的可查询,需要对于每一个服务的每一次调用都有一个全局唯一的标识,可以是业务单据号(如订单号)、也可以是系统分配的操作流水号(如支付记录流水号)。除此之外,操作的时间信息也要有完整的记录。

幂等操作
幂等性,其实是一个数学概念。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数,如:

f(f(x)) = f(x)

在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。也就是说,同一个方法,使用同样的参数,调用多次产生的业务结果与调用一次产生的业务结果相同。
技术分享图片

这一个要求其实也比较好理解,因为要保证数据的最终一致性,很多解决防范都会有很多重试的操作,如果一个方法不保证幂等,那么将无法被重试。

幂等操作的实现方式有多种,如在系统中缓存所有的请求与处理结果、检测到重复操作后,直接返回上一次的处理结果等。

可补偿操作
提到事务,为了保证原子性,就可能发生commit和rollback,那么在分布式事务中,要想进行rollback,就需要提供可补偿操作。

技术分享图片

比如上面的订单处理的例子中,在调用积分服务给积分帐户增加积分操作执行之后,经过分布式事务协调,最终决定回滚整个事务,那么就需要提供一个调用积分服务给积分帐户扣减积分的操作。

并且,补偿操作同时也需要满足幂等性。

TCC操作
TCC 即 Try-Confirm-Cancel。

技术分享图片

Try: 尝试执行业务

完成所有业务检查(一致性) 预留必须业务资源(准隔离性)

Confirm:确认执行业务

真正执行业务 不作任何业务检查 只使用Try阶段预留的业务资源 Confirm操作要满足幂等性

Cancel: 取消执行业务

释放Try阶段预留的业务资源
Cancel操作要满足幂等性

这种类型和可补偿操作类似,就是提供一种提交和回滚的机制。是一种典型的两阶段类型的操作。这里说的两阶段类型操作并不是指2PC,他和2PC还是有区别的。

TCC与2PC协议比较 TCC位于业务服务层而非资源层 TCC没有单独的准备(Prepare)阶段,Try操作兼备资源操作与准备能力 ? Try操作可以灵活选择业务资源的锁定粒度(以业务定粒度) TCC有较高开发成本

总结
本文主要是简单介绍了一下柔性事务和柔性事务实现的基础。柔性事务是目前主流的分布式事务解决方案,其基础模式包含四个:幂等操作、可补偿操作、可查询操作和TCC操作。后续文章会分别介绍关于分布式事务的解决方案,敬请期待。

分布式柔性事务之最大努力通知事务详解

一、概述咱们今天聊聊分布式事务系列中的最后一个方案:最大努力通知事务。最大努力通知事务的主流实现仍是基于MQ来进行事务控制。最大努力通知事务和事务消息都是通知型事务,主要适用于那些需要异步更新数据,并且... 查看详情

干货分享:分布式场景之刚性事务-2pc详解

...业务场景中,如果业务规避不是很麻烦的前提,最优雅的解决方案就是业务规避。事务分类分布式事务实现方案从类型上去分刚性事务、柔型事务。刚性事务:通常无业务改造,强一致性,原生支持回滚/隔离性,低并发,适合... 查看详情

柔性事务和刚性事务

...本可用,最终一致)刚性事务满足ACID理论本文主要围绕分布式事务当中的柔性事务的处理方式进行讨论。柔性事务分为 1.两阶段型2.补偿型3.异步确保型4. 最大努力通知型几种。由于支付宝整个架构是SOA架构,因此传统单... 查看详情

分布式事务管理基础(代码片段)

...#xff09;2.XA接口与JTA(分布式事务协议)分布式事务解决方案分布式事务TCC模式TCC模式与2PC模式TCC模式与ACID分布式事务SAGA模式SaGa与2PcSaGa与TccSaGa与ACIDSaGa开源框架实战解决多数据源事务问题使用JTA处理分布式事务使用Atomikos... 查看详情

分布式事务seata

...或回滚。Seata基于上述架构提供了四种不同的分布式事务解决方案:-XA模式:强一致性分阶段事务模式,牺牲了一定的可用性,无业务侵入-TCC模式:最终一致的分阶段事务模式,有业务侵入-AT模式:最... 查看详情

alibaba/fescar阿里巴巴开源分布式事务中间件

...的,典型的分布式事务需求:我们需要一个分布式事务的解决方案保障业务全局的数据一致性。2.Fescar的发展历程阿里是国内最早一批进行应用分布式(微服务化)改 查看详情

分布式事务--seata(代码片段)

...缺点十、四种模式对比分布式事务--SeataSeata是分布式事务解决方案。致力于提供高性能和简单易用的分布式事务服务,为用户打造一站式的分布式解决方案。官网地址:http://seata.io/,其中的文档、播客中提供了大量的使用说明... 查看详情

分布式服务的事务如何处理?比如dubbo,服务与服务之间的事务怎么处理比较好,现在有没有开源的解决方案?

作者:何明璐链接:http://www.zhihu.com/question/29483490/answer/98237582来源:知乎著作权归作者所有,转载请联系作者获得授权。首先是不建议采用XA两阶段提交方式去处理分布式事务,要知道要能够支持XA分布式事务,必须是要实现XA规... 查看详情

seata架构篇-at模式(代码片段)

前言Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata将为用户提供了AT、TCC、SAGA和XA事务模式,为用户打造一站式的分布式解决方案。X/OpenDTPModelX/OpenDTPModel是X/Open组织定义的... 查看详情

分布式协调与同步之分布式事务

分布式事务的概念事务  包含一系列操作的,一个有边界的工作序列,有明确的开始和结束标志,且要么被完全执行,要么完全失败分布式事务  分布式系统中运行的事务,有多个本地事务组合而成基本特征 &nb... 查看详情

分布式事务处理方式(代码片段)

分布式事务的典型处理方式柔性事务和刚性事务柔性事务满足BASE理论(基本可用,最终一致)。刚性事务满足ACID理论。在分布式事务当中主要讨论的是柔性事务的处理方式。柔性事务分为:两阶段提交型(2PC)三阶段提交型(3... 查看详情

seata基础使用-分布式事务

一、事务二、分布式事务三、Seata基础1、认识Seata2、部署TC(Server端)3、微服务集成Seata四、Seata事务管理-XA模式1、XA模式2、XA模式特点3、实现XA模式五、Seata事务管理-AT模式1、AT模式2、AT模式预防脏写3、AT模式特点4、AT模式实现... 查看详情

springcloud分布式事务管理

...架构微服务架构优点:缺点:分布式事务的引入分布式事务解决方案基于XA协议的两阶段提交消息事务+最终一致性TCC编程模式具体实现LCNByteTCC 在说微服务的优缺 查看详情

微服务架构下处理分布式事务,你必须知道的事儿

...,分布式事务的讨论主要聚焦于强一致性和最终一致性的解决方案。典型方案包括:两阶段提交(2PC,Two-phaseCommit)方案。eBay事件队列方案。TCC补偿模式。缓存数据最终一致性。一致性理论分布式事务的目的是保障分库数据一致性... 查看详情

分布式事务——分布式事务简介分布式事务框架seata(at模式tcc模式tccvsat)分布式事务—mq(代码片段)

分布式事务——分布式事务简介、分布式事务框架Seata(AT模式、Tcc模式、TccVsAT)、分布式事务——MQ一、分布式事务简介如果不是分布式环境的话一般不会接触到这种,一旦是微服务这种,分布式事务是必须要处... 查看详情

详解阿里开源分布式事务框架seata

...Rollback),并和开源社区一起共建开源分布式事务解决方案。Fescar的愿景是:让分布式事务的使用像本地事务的使用一样简单和高效,并逐步解决开发者们遇到的分布式事务方面的所有难 查看详情

分布式事务|使用dotnetcore/cap的本地消息表模式(代码片段)

...表模式,其作为柔性事务的一种,核心是将一个分布式事务拆分为多个本地事务,事务之间通过事件消息衔接,事件消息和上个事务共用一个本地事务存储到本地消息表,再通过定时任务轮询本地消息表进行... 查看详情

分布式事务中间件seata理论详解

简介Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata为用户提供了AT、TCC、SAGA和XA事务模式,为用户打造一站式的分布式解决方案。Seata的设计思路是将一个分布式事务理解成一个全... 查看详情