SeataSaga模式快速入门和最佳实践

擅长研究白癜风的专家 https://jbk.39.net/yiyuanfengcai/ys_bjzkbdfyy/2840/

作者:王特(亦夏)

Seata是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。Seata为用户提供了AT、TCC、SAGA、XA等多种事务模式,帮助解决不同业务场景下的事务一致性问题。

本文主要介绍SeataSaga模式的使用以及最佳实践,围绕三个部分展开,第一部分是SeataSaga的简介、第二部分是带大家快速入门,学习怎么使用SeataSaga模式,最后一部分将会给大家分享一些SeataSaga实践中的经验,帮助用户更快、更好得使用SeataSaga模式。

SeataSaga简介1.1Saga模式

Saga模式是分布式事务的解决方案之一,理念起源于年HectorKenneth发表的Sagas论文。它将整个分布式事务流程拆分成多个阶段,每个阶段对应我们的子事务,子事务是本地事务执行的,执行完成就会真实提交。

它是一种基于失败的设计,如上图,可以看到,每个活动或者子事务流程,一般都会有对应的补偿服务。如果分布式事务发生异常的话,在SAGA模式中,就要进行所谓的‘恢复’,恢复有两种方式,逆向补偿和正向重试。比如上面的分布式事务执行到T3失败,逆向补偿将会依次执行对应的C3,C2,C1操作,取消事务活动的‘影响’。那正向补偿,它是一往无前,T3失败了,会进行不断重试,然后继续按照流程执行T4,T5等。

根据Saga模式的设计,我们可以得到Saga事务模式的优缺点。

优点:

子事务(或流程),提交是本地事务级别的,没有所谓的全局锁,在长事务流程下,避免了长时间的资源锁定;另外这种流水线的处理模型天然符合阶段式信号处理模型,能发掘出更高的性能和吞吐。正向服务和补偿服务都是交给业务开发实现的,所以Saga模式和底层数据库协议是无关的。XA/AT模式可能依赖特定的数据库类型和版本,比如MySQL是5.0之后才支持的XA,那么低版本的MySQL就不能适用到XA模式。

缺点:

也是因为正向服务和补偿服务都由业务开发者实现,所以业务上是有开发成本的,侵入性相对XA/AT打一个注解的方式会高很多。因为一阶段子事务活动提交是本地事务级别的,所以Saga模式不保证隔离性。提交之后就可能‘影响’其他分布式事务、或者被其他分布式事务所‘影响’。例如:其他分布式事务读取到了当前未完成分布式事务中子事务的更新,导致脏读;其他分布式事务更新了当前未完成分布式事务子事务更新过的字段,导致当前事物更新丢失;还有不可重复读的场景等。

所以Saga模式的使用也需要考虑这些问题带来的‘影响’。一般Saga模式的使用场景有如下几个:

长事务流程,业务上难以接受长时间的资源锁定,Saga的特性使得它在长事务流程上处理非常容易;业务性质上,业务可以接受或者解决缺乏隔离性导致的‘影响’。例如部分业务只要求最终一致性,对于隔离性要求没有那么严格,其实是可以落地Saga模式的;分布式事务参与者包含其他机构或者三方的服务,数据资源服务不是我们自身维护,无法提供TCC模式要求的几个接口。1.2SeataSaga

接下来我们看看SeataSaga的实现,Saga主流的实现分为两种:编排式和协调式。SeataSaga的实现方式是编排式,是基于状态机引擎实现的。状态机执行的最小单位是节点:节点可以表示一个服务调用,对应Saga事务就是子事务活动/流程,也可以配置其补偿节点,通过链路的串联,编排出一个状态机调用流程。在Seata里,调用流程目前使用JSON描述,由状态机引擎驱动执行,当异常的时候,我们也可以选择补偿策略,由Seata协调者端触发事务补偿。

有没有感觉像是服务编排,区别于服务编排,SeataSaga状态机是Saga+服务编排,支持补偿服务,保证最终一致性。

我们来看看一个简单的状态机流程定义:

上方是一个Name为reduceIncentoryAndBalance的状态机描述,里面定了ServiceTask类型的服务调用节点以及对应的补偿节点CompensateReduceInventory。

看看几个基本的属性:

Type:节点类型,SeataSaga支持多种类型的节点。例如:ServiceTask是服务调用节点。ServiceName/ServiceMethod:标识ServiceTask服务及对应方法Input/Output:定义输入输出参数,输入输出参数取值目前使用的是SPEL表达式。Retry:控制重试流程Catch/Next:用于流程控制、衔接,串联整个状态机流程

更多类型和语法可以参考Seata官方文档[1],可以看到状态机JSON声明还是有些难度的,为了简化状态机JSON的编写,我们也提供了可视化的编排界面[2],如下所示,编排了一个较为复杂的流程。

话不多说,我们进入下面的实践环节。

SeataSaga使用入门2.1从Seata


转载请注明:http://www.aierlanlan.com/rzdk/9217.html