Saga 模式

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

Saga模式示意图

实现

基于状态机引擎的 Saga 实现

目前 SEATA 提供的 Saga 模式是基于状态机引擎来实现的,机制是:

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

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

  3. 状态图 json 由状态机引擎驱动执行,当出现异常时状态引擎反向执行已成功节点对应的补偿节点将事务回滚

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

注意:异常发生时是否进行补偿也可由用户自定义决定

示例状态图:

示例状态图

设计

状态机引擎原理

状态机引擎原理
  • 图中的状态图是先执行 stateA,再执行 stateB,然后执行 stateC

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

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

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

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

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

状态机引擎设计

状态机引擎设计

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

  • Eventing 层

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

  • ProcessController 层

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

  • StateMachineEngine 层:

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

    • 提供 API、状态机语言仓库

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

状态机的高可用设计

状态机的高可用

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

当应用正常运行时(图中上半部分):

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

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

当一台应用实例宕机时(图中下半部分):

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

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

Last updated