首页 > 其他分享 >分布式事务-Seata解决方案

分布式事务-Seata解决方案

时间:2023-12-07 09:55:38浏览次数:32  
标签:事务 服务 Seata saga 解决方案 协调 回滚 事件 分布式

一、定义

      Seata解决方案是分布式事务解决方案之一。常用的分布式事务解决方案有:2PC,3PC,TCC,SAGA(seata)、本地消息表、MQ消息事务、最大努力通知。

      Seata是一款分布式解决方案,致力于提供高性能和简单易用的分布式事务服务。提供事务模式有:AT,TCC,SAGA,XA。其中AT是阿里首推的模式,阿里云有商用版本GTS(Global Transaction Service 全局事务服务)。

二、3大角色

       【TC】Transaction Coordinator -事务协调者

         维护全局和分支事务的状态,驱动全局事务提交或回滚。

        【TM】Transaction Manager -事务管理者

         定义全局事务的范围:开始全局事务、提交或回滚全局事务。

        【RM】Resource Manager -资源管理者

          管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

三、SAGA模式

        分布式事务领域最有名气的解决方案之一。saga是由一系列的本地事务构成,每一个本地事务在更新完数据库之后,会发布一条消息或者一个事件来触发saga中下一个本地事务的执行,如果一个本地事务因为某些业务规则无法满足而失败,saga会执行在这个失败的事务之前成功提交的所有事务的补偿操作。

        saga的实现有很多种方式,其中最流行的两种方式是:

        【命令协调】Order Orchestrator:这种方式的工作形式就像一只乐队,由一个只会家(协调中心)来协调大家工作,协调中心来告诉saga的参与方,应该执行哪一个本地事务。

        【事务编排】Event Choreographyo:这种方式没有协调中心,整个模式的工作方式就像舞蹈一样,各个舞蹈演员按照预先安排的动作和走位各自表演,最终形成一只舞蹈。处于当前saga下的各个服务,会产生某类事件,或者监听其它服务产生的事件并决定是否需要针对监听到的时间做出响应。

         3.1、命令协调

         中央协调器(Orchestrator,简称 OSO)以命令/回复的方式与每项服务进行通信,全权负责告知每个参与者该作什么以及什么时候做。

  1.  主业务接口发起事务业务,开启订单事务。
  2. saga协调器库存服务请求扣减库存,库存服务操作后,回复处理结果。
  3. saga协调器账户服务请求扣减余额,账户服务操作后,回复处理结果,处理结果。
  4. saga协调器订单服务请求创建订单,订单服务操作后,回复。
  5. 主业务逻辑接收并处理saga协调器事务处理结果回复。

     中央协调器OSO必须事先知道执行整个事务所需的流程,如果有任何失败,它还负责通过向每个参与者发送命令来撤销之前的操作来协调分布式的回滚,基于中央协调器协调一切时,回滚要容易很多,因为协调器默认是执行正向流程,回滚时只要执行逆向流程即可。

    即执行顺序:A -> B ->C   回滚顺序: C ->B->A

         3.2、事件编排

         在基于事件的方式中,第一个服务执行完本地事务之后,会产生一个事件,其它服务会监听这个事件,触发该服务本地事务的执行,并产生新的事件。当最后一个服务执行本地事务并且不发布任何事件时,意味着分布式事务执行结束,或者它发布的时间没有被任何saga参与者听到都意味着事务结束。

  1.  主业务接口发布下单事件。
  2. 库存服务监听下单事件,扣减库存,并发布库存已扣减事件。
  3. 账户服务监听已扣减库存事件,扣减余额,并发布已扣减余额事件。
  4. 订单服务监听已扣减余额事件,创建订单,并发布下单成功事件。
  5. 主业务逻辑监听下单成功事件后,执行后续处理。

四、异常恢复

         saga模式下,每个事务参与者提供一对接口,一个做正常事务操作,一个做异常事务回滚操作。比如:支付与退款,扣款与回补等。

          

          saga支持事务恢复策略。分为两种方式:向后恢复(backward recovery),向前恢复(forward recovery)

         4.1、向后恢复

                 当执行事务失败时,补偿所有已完成的事务,是“一退到底”的方式,这种做法的效果是撤销掉之前所有成功的子事务,使得整个saga的执行结果撤销。

         

             从上图可知事务执行到了支付事务T3,但是失败了,因此事务回滚需要从C3,C2,C1依次进行回滚补偿,对应的执行顺序为:T1,T2,T3,C3,C2,C1

       4.2、向前恢复

             对于执行不通过的事务,会尝试重试事务,这里有个假设就是每个事务最终都会成功,这种方式适用于必须要成功的场景,事务失败了重试,不需要补偿。

    

 五、优缺点

        5.1、命令协调设计

                优点:

    1. 服务之间关系简单,避免服务间循环依赖,因为saga协调器会调用saga参与者,但参与者不会调用协调器。
    2. 程序开发简单。只需要执行命令/回复(其实回复消息也是一种事件消息),降低参与者的复杂性。
    3. 易维护扩展,在添加新步骤时,事务复杂性保持线性,回滚更容易管理,更容易实施和测试。

                缺点:

    1. 中央协调器处理逻辑容易变得庞大复杂,导致难以维护;
    2. 存在协调器单点故障风险;

        5.2、事件编排设计

                优点:

    1. 避免中央协调器单点故障风险。
    2. 当涉及的步骤较少,服务开发简单,容易实现。

                缺点:

    1. 服务之间存在循环依赖的风险。
    2. 当涉及的步骤较多,服务间的关系混乱,难以追踪调测。

六、命令VS事件 

       命令协调和事件编排如何选择:

  1. 系统复杂性:如果系统的业务逻辑复杂,事务需要严格控制和编排,命令协调方式可以提供更好的可见性和可控性。
  2. 系统扩展性:如果系统需要频繁扩展和修改,需要一定的灵活性,事件编排方式可以提供解耦和扩展性更好的架构。
  3. 性能需求:如果需要更好的性能和可伸缩性,并行执行事务的各个步骤,事件编排方式更适合。
  4. 异步需求:如果系统需要异步处理和解耦,事件编排方式提供了更好的可行性。    

 

标签:事务,服务,Seata,saga,解决方案,协调,回滚,事件,分布式
From: https://www.cnblogs.com/xiaobaicai12138/p/17879761.html

相关文章

  • 分布式主键
     核心概念::ShardingSpherehttps://shardingsphere.apache.org/document/current/cn/features/sharding/concept/ 分布式主键传统数据库软件开发中,主键自动生成技术是基本需求。而各个数据库对于该需求也提供了相应的支持,比如MySQL的自增键,Oracle的自增序列等。数据......
  • 元宇宙解决方案——云端GPU在元宇宙中的作用
    GPU算力可以说是我们现在信息化时代的基础设施,在某种程度上说我们已经进入了算力时代,手机、电脑、车载等算力已经渗透到各行各业了。当然算力对元宇宙也很重要,尤其是在可视化方面,元宇宙需要很逼真的渲染,同时它的物理动作也要符合物理定律,人才能沉浸其中,所以要很强的图形渲染、物......
  • SpringBoot Seata 死锁问题排查
    现象描述:SpringBoot项目,启动的时候卡住了,一直卡在那里不动,没有报错,也没有日志输出但是,奇怪的是,本地可以正常启动好吧,姑且先不深究为什么本地可以启动而部署到服务器上就无法启动的问题,这个不是重点,重点是怎么让它启动起来。(PS:我猜测可能是环境不同造成的,包括操作系统不同和JD......
  • uniapp打包iOS应用并通过审核:代码混淆的终极解决方案 ✨
    摘要本篇博客将教你如何使用JavaScript-obfuscator插件来一键发行和混淆iOS上的uniapp代码。通过安装插件、创建运行脚本,并执行混淆操作,你将能够轻松通过审核,提高应用程序的安全性。......
  • 开发者热议GitHub代码搜索政策,最佳搜索解决方案探索
    近日,名为koepnick的开发者因在一台老式电脑上使用GitHub搜索自己的存储库代码,却没有手机等设备协助验证,导致无法登录GitHub账户,发文怒斥GitHub:如若没有登录,就无法使用搜索代码服务,与其这样不如弃用。 其实,早在今年6月,GitHub官方便发布了一封《代码搜索现在需要登录》的公告......
  • 【解决方案】MySQL5.7 百万数据迁移到 ElasticSearch7.x 的思考
    目录前言一、一次性全量二、定时任务增量三、强一致性问题四、canal框架4.1基本原理4.2安装使用(重点)版本说明4.3引入依赖(测试)4.4代码示例(测试)五、文章小结前言在日常项目开发中,可能会遇到使用ES做关键词搜索的场景,但是一般来说业务数据是不会直接通过CRUD写进ES的。因为......
  • C2 CompilerThread9 长时间占用CPU解决方案
    一、问题描述近期在进行日常巡检时发现,线上部分应用服务器的CPU突然比以往高出很多,经过登录机器排查确认是C2CompilerThread9线程始终长时间运行消耗了CPU。排查步骤在上篇博文有记录总结,地址:排查CPU异常步骤_u012538947的专栏-CSDN博客_cpu异常异常线程的堆栈如下:"C2Compile......
  • 【backward解决方案与原理】网络模型在梯度更新时出现变量版本号机制错误
    【backward解决方案与原理】网络模型在梯度更新时出现变量版本号机制错误报错详情错误产生背景原理解决方案RuntimeError:oneofthevariablesneededforgradientcomputationhasbeenmodifiedbyaninplaceoperation报错详情  模型在backward时,发现如下报错......
  • 【解决方案】adb server version (41) doesn't match this client (36);
    【GiraKoo】adbserverversion(41)doesn'tmatchthisclient(36);环境夜神模拟器无法与AndroidStudio连接。使用命令行连接时会提示adbserverversion(41)doesn'tmatchthisclient(36)。通过adbversion命令,可以查看adb的版本。夜神的nox_adb.exe是36版本的,所以导......
  • Zookeeper——分布式一致性协议及Leader选举原理
    一、引言随着业务的增长,单体架构发展为分布式架构,大大提升了业务的处理能力,但同时也带来了很多单体架构不存在的问题,如:各节点之间网络通信的异常以及因其引起的脑裂问题(网络分区)。引出“三态”。在单体架构中只会存在“成功”或“失败”两种结果,但是在分布式架构中由于网络异......