4.1.1 微服务架构对分布式事务的需求
4.1.2 分布式事务的挑战
分布式事务管理的事实标准:
- X/Open XA, 两阶段提交
分布式事务的问题:
- 许多技术 (NoSQL, MongoDB, Cassandra, RabbitMQ, Apache Kafka) 并不支持 XA
- 本质上是同步进程间通信 (降低可用性)
CAP
4.1.3 使用 Saga 模式维护数据一致性
一个 Saga 表示需要更新多个服务中数据的一个系统操作. Saga 由一连串的本地事务组成.
- 异步消息确保 Sage 的所有步骤都被执行
- Saga 缺少 ACID 中的隔离性 (I)
- 想要回滚 Saga, 必须使用补偿事务
示例 Saga: Create Order Saga
Saga 的第一个本地事务由创建订单的外部请求启动, 其他5个本地事务均由前一个完成触发.
参与 Saga 的服务使用异步消息进行通信.
- 当本地事务完成时, 服务会发布消息
- 此消息将触发 Saga 中的下一个步骤
Saga 使用补偿事务来回滚所做出的改变
Saga 无法自动回滚, 如果需要回滚, 那么必须编写补偿事务 (手动操作数据库撤销更改):
- 以相反的次序执行补偿事务
补偿事务例子:
- 一些事务不需要补偿事务
- 前3个步骤: 可补偿性事务 (会失败的步骤)
- 第4个步骤: Saga 的关键性事务 (pivot transaction) (不可能失败的步骤)
- 最后两个: 可重复性事务 (总会成功)
使用补偿事务例子:
- 假设消费者信用卡授权失败场景