SEATA Saga 模式
概述
Saga模式是SEATA提供的长事务解决方案,在Saga模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务开发实现。
理论基础:Hector & Kenneth 发表论⽂ Sagas (1987)
Saga的实现:
基于状态机引擎的 Saga 实现:
目前SEATA提供的Saga模式是基于状态机引擎来实现的,机制是:
- 通过状态图来定义服务调用的流程并生成 json 状态语言定义文件
- 状态图中一个节点可以是调用一个服务,节点可以配置它的补偿节点
- 状态图 json 由状态机引擎驱动执行,当出现异常时状态引擎 反向执行已成功节点对应的补偿节点将事务回滚
注意: 异常发生时是否进行补偿也可由用户自定义决定
- 可以实现服务编排需求,支持单项选择、并发、子流程、参数转换、参数映射、服务执行状态判断、异常捕获等功能
示例状态图:
设计
状态机引擎原理:
- 图中的状态图是先执行stateA, 再执行stateB,然后执行stateC
- "状态"的执行是基于事件驱动的模型,stateA执行完成后,会产生路由消息放入EventQueue,事件消费端从EventQueue取出消息,执行stateB
- 在整个状态机启动时会调用Seata Server开启分布式事务,并生产xid, 然后记录"状态机实例"启动事件到本地数据库
- 当执行到一个"状态"时会调用Seata Server注册分支事务,并生产branchId, 然后记录"状态实例"开始执行事件到本地数据库
- 当一个"状态"执行完成后会记录"状态实例"执行结束事件到本地数据库, 然后调用Seata Server上报分支事务的状态
- 当整个状态机执行完 成, 会记录"状态机实例"执行完成事件到本地数据库, 然后调用Seata Server提交或回滚分布式事务
状态机引擎设计:
状态机引擎的设计主要分成三层, 上层依赖下层,从下往上分别是:
- Eventing 层:
- 实现事件驱动架构, 可以压入事件, 并由消费端消费事件, 本层不关心事件是什么消费端执行什么,由上层实现
- ProcessController 层:
- 由于上层的Eventing驱动一个“空”流程引擎的执行,"state"的行为和路由都未实现, 由上层实现
基于以上两层理论上可以自定义扩展任何"流程"引擎
- StateMachineEngine 层:
- 实现状态机引擎每种state的行为和路由逻辑
- 提供 API、状态机语言仓库
状态机的高可用设计:
状态机引擎是无状态的,它是内嵌在应用中。
当应用正常运行时(图中上半部分):
- 状态机引擎会上报状态到Seata Server;
- 状态机执行日志存储在业务的数据库中;
当一台应用实例宕机时(图中下半部分):
- Seata Server 会感知到,并发送事务恢复请求到还存活的应用实例;
- 状态机引擎收到事务恢复请求后,从数据库里装载日志,并恢复状态机上下文继续执行;