SAGA事务

文章目录

    • SAGA定义
    • 步骤排序
    • 分类
      • 协同式
      • 编排式
    • 事务隔离对策

SAGA定义

  • 柔性事务
  • 传统同步事务难点:
    • 部分数据库不支持XA。
    • 传统分布式事务是同步通信,会降低系统可用性
  • SAGA:使用异步消息协调一系列本地事务,维护多个服务之间的数据一致性。
  • 是一种长事务解决方案,适用于业务流程长且需要保证事务最终一致性的业务系统。

步骤排序

  1. 可补偿事务。可能失败,需要编写补偿事务做回滚。
  2. 关键性事务。后面跟着不可能失败的步骤。
  3. 可重复事务。总会成功。

分类

协同式

  • 决策和执行顺序逻辑分布在saga的每一个参与方,通过交换事件沟通。
  • 注意可靠的时间通信:
    • 更新本地数据库和发布事件作为一个事务(事务消息或者DTS)。
    • 参与方通过消息传递相关性ID,如订单id,操作事务目标。
  • 优点:
    • 局部简单。每个服务只管执行本地事务+发布事件。
    • 松耦合。参与方只订阅事件,不产生耦合。
  • 缺点。
    • 整体难理解。逻辑分散。
    • 服务之间可能循环依赖。
    • 紧耦合风险。可能需要和消息发送方的代码更新保持同步。

编排式

  • 决策和执行顺序逻辑集中在一个saga编排器。
    • 编排器做两件事:
      • 发出命令式消息指示参与方完成本地事务。
      • 接收消息改变事务状态机,准备发布下一个命令。
    • 参与方:
      • 接收消息、执行本地事务、回复消息。
  • 注意点:本地事务+发消息在一个事务内。
  • 优点:
    • 依赖简单。编排器和参与方依赖,无循环依赖。
    • 耦合少。编排器和参与方交互。
    • 关注点隔离,简化业务逻辑。领域对象只需要知道维护自身状态机,具体的saga交给编排器。
  • 缺点:
    • 编排器逻辑较复杂。可考虑编排器排序,参与方包含业务逻辑。

事务隔离对策

SAGA是ACD,缺乏隔离,可能导致一些问题。参考隔离级别。

  • 语意锁。如status字段,失败时重试或者阻塞。
  • 交换式更新。更新操作设计成可交换。
  • 悲观视图。saga步骤设计,消除脏读。
  • 重读值。更新之前重新读取记录,验证是否修改,修改则取消。
  • 版本文件。记录更新操作,聚合排序。
  • 风险评定。根据业务决定使用的分布式事务方式,不一定是saga。

你可能感兴趣的:(架构)