4.1.1 微服务架构对分布式事务的需求

image.png

4.1.2 分布式事务的挑战

分布式事务管理的事实标准:

  • X/Open XA, 两阶段提交

分布式事务的问题:

  • 许多技术 (NoSQL, MongoDB, Cassandra, RabbitMQ, Apache Kafka) 并不支持 XA
  • 本质上是同步进程间通信 (降低可用性)

CAP

4.1.3 使用 Saga 模式维护数据一致性

一个 Saga 表示需要更新多个服务中数据的一个系统操作. Saga 由一连串的本地事务组成.

image.png

  • 异步消息确保 Sage 的所有步骤都被执行
  • Saga 缺少 ACID 中的隔离性 (I)
  • 想要回滚 Saga, 必须使用补偿事务

示例 Saga: Create Order Saga

Saga 的第一个本地事务由创建订单的外部请求启动, 其他5个本地事务均由前一个完成触发.

image.png

参与 Saga 的服务使用异步消息进行通信.

  1. 当本地事务完成时, 服务会发布消息
  2. 此消息将触发 Saga 中的下一个步骤

Saga 使用补偿事务来回滚所做出的改变

Saga 无法自动回滚, 如果需要回滚, 那么必须编写补偿事务 (手动操作数据库撤销更改):

  • 以相反的次序执行补偿事务

image.png

补偿事务例子:

  • 一些事务不需要补偿事务

image.png

  • 前3个步骤: 可补偿性事务 (会失败的步骤)
  • 第4个步骤: Saga 的关键性事务 (pivot transaction) (不可能失败的步骤)
  • 最后两个: 可重复性事务 (总会成功)

使用补偿事务例子:

  • 假设消费者信用卡授权失败场景

image.png