SAGA定义
- 柔性事务
- 传统同步事务难点:
- 部分数据库不支持XA。
- 传统分布式事务是同步通信,会降低系统可用性。
- SAGA:使用异步消息协调一系列本地事务,维护多个服务之间的数据一致性。
- 是一种长事务解决方案,适用于业务流程长且需要保证事务最终一致性的业务系统。
步骤排序
- 可补偿事务。可能失败,需要编写补偿事务做回滚。
- 关键性事务。后面跟着不可能失败的步骤。
- 可重复事务。总会成功。
分类
协同式
- 决策和执行顺序逻辑分布在saga的每一个参与方,通过交换事件沟通。
- 注意可靠的时间通信:
- 更新本地数据库和发布事件作为一个事务(事务消息或者DTS)。
- 参与方通过消息传递相关性ID,如订单id,操作事务目标。
- 优点:
- 局部简单。每个服务只管执行本地事务+发布事件。
- 松耦合。参与方只订阅事件,不产生耦合。
- 缺点。
- 整体难理解。逻辑分散。
- 服务之间可能循环依赖。
- 紧耦合风险。可能需要和消息发送方的代码更新保持同步。
编排式
- 决策和执行顺序逻辑集中在一个saga编排器。
- 编排器做两件事:
- 发出命令式消息指示参与方完成本地事务。
- 接收消息改变事务状态机,准备发布下一个命令。
- 参与方:
- 接收消息、执行本地事务、回复消息。
- 编排器做两件事:
- 注意点:本地事务+发消息在一个事务内。
- 优点:
- 依赖简单。编排器和参与方依赖,无循环依赖。
- 耦合少。编排器和参与方交互。
- 关注点隔离,简化业务逻辑。领域对象只需要知道维护自身状态机,具体的saga交给编排器。
- 缺点:
- 编排器逻辑较复杂。可考虑编排器排序,参与方包含业务逻辑。
事务隔离对策
SAGA是ACD,缺乏隔离,可能导致一些问题。参考隔离级别。
- 语意锁。如status字段,失败时重试或者阻塞。
- 交换式更新。更新操作设计成可交换。
- 悲观视图。saga步骤设计,消除脏读。
- 重读值。更新之前重新读取记录,验证是否修改,修改则取消。
- 版本文件。记录更新操作,聚合排序。
- 风险评定。根据业务决定使用的分布式事务方式,不一定是saga。