转转牵头投资建立B2B二手交易平台“菜货侠”,深度探索二手手机产业链
06-18
-起源-? Saga模型起源于Hector Garcia-Molina和Kenneth Salem发表的论文《Sagas》。它是最早出现的与分布式事务相关的概念。
Saga模型将一个分布式事务拆分为多个本地事务。每个本地事务都有对应的执行模块和补偿模块(对应TCC中的Confirm和Cancel)。
当Saga事务中任意一个本地事务出现问题时,可以通过调用相关的补偿方法来恢复之前的事务,以达到最终的事务一致性。 - 组成 - Saga模型主要分为:子交易(本地交易)的交易链。
每个Saga子事务Tn都有一个对应的补偿定义Cn,用于撤销Tn造成的结果。每个Tn没有“保留”动作,直接提交到库。
执行顺序:子事务序列T1,T2,…,Tn完成(最好情况)或者序列T1,T2,…,Tj,Cj-1,…,C2,C1,0 恢复方法: 向后恢复:补偿所有已完成的事务。如果任何子交易失败。 正向恢复:重试失败的事务。假设每个子交易最终都会成功。 从上面Saga模型的定义来看,Saga模型可以满足事务的三个特性: 原子性:Saga协调器协调事务链中的本地事务要么全部提交,要么全部回滚。一致性:Saga事务可以达到最终的一致性。 持久性:基于本地事务,所以这个功能可以很好的实现。 从数据隔离性分析可以发现,Saga模型无法保证外部原子性和隔离性,因为可以查看其他saga的一些结果。 论文中有相应的表述: - 注释 - Saga 交易与 TCC 交易相同。它们都严重依赖业务改造,因此要求业务方在设计时遵循四种策略: 允许空补偿:网络异常导致交易参与者只收到补偿操作指令,因为没有进行正常操作,所以需要空补偿。 保持幂等性:一笔交易的前向操作和补偿操作都可能被重复触发,因此必须保证操作的幂等性。防止资源挂起:原因是网络异常导致事务的前向操作指令晚于补偿操作指令到达,因此必须丢弃此正常操作,否则会出现资源挂起问题。 提供隔离保证:遵循“长胜于短”的设计 - Saga 和 TCC 的比较 - Saga 和 TCC 虽然都是补偿事务,但也因提交阶段不同而有所不同:Saga 没有 Try 行为,直接 Commit,这样就会留下原始交易操作的痕迹。取消是一种不完美的补偿,需要考虑对业务的影响。 TCC Cancel 是一个完美补偿的回滚。补偿操作将彻底清理之前的原始交易操作,用户不会知晓交易被取消之前的状态信息。 Saga的补偿操作通常可以异步执行,TCC的Cancel和Confirm可以跟进是否需要异步执行。 Saga对业务侵入较少,只需要提供反向操作Cancel;而TCC则需要对业务进行全球流程转型。 TCC 的最小通信次数为 2n,而 Saga 的最小通信次数为 n(n = 子事务数)。 - Saga实现 - 目前业界提供了两种Saga实现方式。 一种是基于业务逻辑层Proxy设计(基于AOP实现),比如华为的ServiceComb;另一种是状态机实现机制,比如阿里巴巴的Seata Saga模式。 Aop Proxy 的实现原理如下:在业务逻辑层调用中添加事务注解@Around("execution(* *(..)) && @annotation(TX)")。 Proxy 在调用真正的业务逻辑之前生成全局事务。唯一的 TXID 标识事务组。 TXID 存储在 ThreadLocal 变量中。它在方法开始之前写入,并在方法完成后清除。 将 TXID 写入远程数据库,并将事务组设置为起始状态。在业务逻辑层调用数据访问层之前,通过RPCProxy代理记录当前的调用请求参数。 如果业务正常,调用完成后,将当前方法的调用记录归档或删除。如果业务异常,查询调用链会反向补偿。 数据访问层设计:原有接口必须保证幂等性并满足局部原子性。提供补偿接口,实现反向操作。 对此,可以在框架层面实现一些通用的补偿实现,以降低使用成本。当然,补偿接口也必须具有幂等性保证。 还可以提供补偿注释。在原理接口方法的基础上,在方法名上添加注解,标记补偿方法名:@Compensable(cancelMethod="cancelRecord") ?补偿策略:首先调用执行失败,修改事务组状态;其次,分布式事务补偿服务异步执行补偿状态机引擎Saga的原理如下:流程是——先执行stateA,再执行stateB,最后执行stateC。 “状态”的执行是基于事件驱动的模型。 stateA执行完成后,会生成路由消息并放入EventQueue中。 ,事件消费者从EventQueue中检索消息并执行stateB。当整个状态机启动时,会调用Seata Server启动分布式事务,生成xid,然后将“状态机实例”启动事件记录到本地数据库。 当执行到达“状态”时,调用Seata Server注册分支事务并生成branchId,然后将“状态实例”启动执行事件记录到本地数据库。当一个“状态”执行完成后,“状态实例”执行结束事件会记录到本地数据库,然后调用Seata Server上报分支事务的状态。 当整个状态机执行完成后,“状态机实例”执行完成事件会被记录到本地数据库,然后调用Seata Server来提交或回滚分布式事务。 - Saga Aop 代理流程示例 - 交易创建订单交易组正常流程:锁定库存 -> 红包减免 -> 创建订单正常流程 交易创建订单交易组异常流程:异常流程 - 总结 - 我们介绍了XA,2PC,还有四种交易模型,3PC和TCC,但不推荐。 本文的Saga模型是我老板推荐的事务模型,可以适用于大多数同步事务。由于目前华为ServiceComb中的交易模块还不是很独立,因此强烈推荐Seata。 Seata不仅支持Saga模式,还提供状态机的可视化操作和制作,使用成本相对较低。而且Seata的AT模式利用数据库镜像实现了自动补偿机制,进一步优化了Saga模型的缺点。 - 作者简介 - 林怀川毕业于西安交通大学;奈雪教育讲师、企业级源码负责人,原大数金融高级架构师、技术委员会创始人、技术总监;曾任天阳红叶贸易业务部技术总监;多年互联网金融行业(ToB)经验。孙轩毕业于浙江大学,奈学教育创始人兼CEO,原转转公司技术委员会主席,原58集团技术委员会主席,原百度高级研发工程师,腾讯云TVP,阿里云MVP,在线直播播音班《百万架构师》品牌创始人。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-06
06-18
06-17
06-18
06-18
06-17
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用