首页 > 其他分享 >分布式事务(四):Seata之Saga事务模式原理

分布式事务(四):Seata之Saga事务模式原理

时间:2024-02-07 17:13:49浏览次数:25  
标签:事务 Seata Saga Server 状态机 引擎 执行

  Saga模式是SEATA提供的长事务解决方案,在Saga模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务开发实现。

  0

Seata2.x提供的Saga是基于状态机引擎实现的,下面来看看状态机引擎。

1、状态机引擎机制

  1、通过状态图来定义服务调用的流程生成json状态语言定义文件;

  

  2、状态图中一个节点可以是调用一个服务,节点可以配置它的补偿节点;

  3、状态图json由状态机引擎驱动执行,当出现异常时状态引擎反向执行已成功节点对应的补偿节点将事务回滚 (异常发生时是否进行补偿可由用户自行决定)

  4、可以1实现服务编排需求,支持单项选择、并发、子流程、参数转换、参数映射、服务执行状态判断、异常捕获等

2、状态机引擎原理

  

  ·以上状态图先执行stateA, 再执行stateB,然后执行stateC;

  ·"状态"的执行是基于事件驱动的模型,stateA执行完成后,会产生路由消息放入EventQueue,事件消费端从EventQueue取出消息,执行stateB;

  ·在整个状态机启动时会调用Seata Server开启分布式事务,并生产xid, 然后记录"状态机实例"启动事件到本地数据库;

  ·当执行到一个"状态"时会调用Seata Server注册分支事务,并生产branchId, 然后记录"状态实例"开始执行事件到本地数据库;

  ·当一个"状态"执行完成后会记录"状态实例"执行结束事件到本地数据库, 然后调用Seata Server上报分支事务的状态;

  ·当整个状态机执行完成, 会记录"状态机实例"执行完成事件到本地数据库, 然后调用Seata Server提交或回滚分布式事务。

3、状态机引擎设计

0

  状态机引擎的设计主要分成三层, 上层依赖下层,从下往上分别是:

3.1、Eventing 层

  实现事件驱动架构, 可以压入事件, 并由消费端消费事件, 本层不关心事件是什么消费端执行什么,由上层实现

3.2、ProcessController 层

  由于上层的Eventing驱动一个“空”流程引擎的执行,"state"的行为和路由都未实现, 由上层实现

  基于以上两层理论上可以自定义扩展任何"流程"引擎

3.3、StateMachineEngine 层

  实现状态机引擎每种state的行为和路由逻辑

  提供 API、状态机语言仓库

4、状态机的高可用

0

  状态机引擎是无状态的,它是内嵌在应用中。

4.1、应用正常运行

  图中上半部分表示;

  状态机引擎会上报状态到Seata Server;

  状态机执行日志存储在业务的数据库中。

4.2、某台应用实例宕机

  图中下半部分表示;

  Seata Server 会感知到,并发送事务恢复请求到还存活的应用实例;

  状态机引擎收到事务恢复请求后,从数据库里装载日志,并恢复状态机上下文继续执行。

 

标签:事务,Seata,Saga,Server,状态机,引擎,执行
From: https://www.cnblogs.com/RunningSnails/p/18011072

相关文章

  • 分布式事务(五):Seata之XA事务模式原理
    1、XA事务模式概述XA事务模式是在Seata定义的分布式事务框架内,利用事务资源(数据库、消息服务等)对XA协议的支持,以XA协议的机制来管理分支事务的一种事务模式。 1.1、执行阶段可回滚:业务SQL操作放在XA分支中进行,由资源对XA协议的支持来保证可回滚持......
  • 分布式事务(三):Seata之TCC事务模式原理
    TCC模式是Seata支持的一种由业务方细粒度控制的侵入式分布式事务解决方案,是继AT模式后第二种支持的事务模式。其分布式事务模型直接作用于服务层,不依赖底层数据库,可以灵活选择业务资源的锁定粒度,减少资源锁持有时间,可扩展性好,是为独立部署的SOA服务而设计的。TCC......
  • 分布式事务(二):Seata概述
    Seata官方文档地址:https://seata.apache.org/zh-cn/。1、Seata引入 用户购买商品的业务逻辑。整个业务逻辑由3个微服务提供支持:仓储服务:对给定的商品扣除仓储数量。订单服务:根据采购需求创建订单。帐户服务:从用户帐户中扣除余额。在上述架构图中有仓......
  • Jmeter事务控制器
    事务控制器(TransactionController),事务控制器生成一个额外的示例,该示例测量执行嵌套测试元素所花费的总时间GenerateParentSample:生成父例,如果选中则该样本将作为其他样本的父样本生成,如果不选中则该样本将作为独立样本生成Includedurationoftimerandpre-postprocess......
  • 数据库之隔离级别,脏读幻读,事务特性
    目录1事务隔离级别1.1默认隔离级别1.2读未提交1.3读已提交1.4可重复读1.5序列化2事务关键词2.1定义(脏读,不可重复读,虚读)2.2不可重复读与幻读的区别3事务的四个特性3.1原子性3.2一致性3.3隔离性3.4持久性1事务隔离级别1.1默认隔离级别ISOLATION_DEFAULT:默认......
  • 分布式事务Seata
    TC (TransactionCoordinator)-事务协调者:维护全局和分支事务的状态,驱动全局事务提交或回滚。TM (TransactionManager)-事务管理器:定义全局事务的范围,开始全局事务、提交或回滚全局事务。RM (ResourceManager)-资源管理器:管理分支事务处理的资源(Resource),与TC......
  • kettle从入门到精通 第四十一课 kettle 事务(单个转换文件)
    1、大家都知道,我们在平常写java或者C#等代码时,如果涉及操作多个表时为了保持数据一致性需要开启事务,同样kettle也支持事务,今天我们一起来学习下kettle单个转换文件内的事务特性。转换文件中的步骤是并行执行的,每个步骤都打开一个独立的数据库连接并开始一个事务。尽管这样在很多......
  • spring声明式事务(@Transactional)开发常犯的几个错误及解决办法
    目前JAVA的微服务项目基本都是SSM结构(即:springCloud+springMVC+Mybatis),而其中Mybatis事务的管理也是交由spring来管理,大部份都是使用声明式事务(@Transactional)来进行事务一致性的管理,然后在实际日常开发过程中,发现很多开发同学都用错了spring声明式事务(@Transactional)或者说使用......
  • Spring事务的传播行为
    Spring事务的传播行为1.概述当我们遇到下面的情况时,一个service中调用了另一个service中的方法(两个service中都存在事务),此时bservice中的事务就被传播到了aservice中,这样就产生了事务的传播。@SercicepublicclassAservice{@AutoWiredprivateBservicebservice......
  • SpringBoot 整合多数据源的事务问题
    代码先贴代码:核心就是:Spring给我们提供的一个类AbstractRoutingDataSource,然后我们再写一个切面来切换数据源,肯定要有一个地方存储key还要保证上下文都可用,所以我们使用ThreadLocal来存储数据源的keypom.xml<dependency><groupId>org.springframework.boot</gr......