Saga 模式:微服务架构中的分布式事务
在传统的整体应用程序中,维护多个实体之间的数据一致性非常简单。关系数据库引擎提供封装在本地 SQL 事务中的 ACID(原子性、一致性、隔离性、持久性)保证。如果下单、付款扣除或库存储备中途失败,调用 ROLLBACK 会立即恢复每个数据库修改。
然而,当迁移到现代微服务架构时,数据管理发生了根本性的变化。为了保证域自治和独立的可扩展性,每个微服务都拥有自己的私有数据库。单个业务操作(例如处理电子商务结帐)现在跨越多个服务边界和数据库引擎(例如,用于订单的 PostgreSQL、用于支付的 DynamoDB、用于库存的 Redis)。
由于分布式微服务不能依赖于单个数据库事务,因此维护跨网络边界的数据一致性成为分布式系统工程中最具挑战性的问题之一。
为了在不牺牲系统可用性或性能的情况下解决这个问题,软件架构师依赖 Saga 模式。
在本次深入研究中,我们将探讨传统分布式事务失败的原因,分解 Saga 模式的核心机制,比较 Choreography 与 Orchestration,分析隔离对策,检查 Go 和 Java 中的生产代码实现,并学习如何安全地处理现实世界的故障回滚。
根本问题:为什么微服务中的两阶段提交 (2PC) 失败 在采用 Saga 模式之前,工程师经常会问:为什么我们不能在微服务中使用传统的两阶段提交(2PC / XA)?
2PC 的机制 两阶段提交使用中央事务管理器分两个阶段协调跨多个数据库节点的分布式事务:
准备阶段:事务管理器要求所有参与的数据库节点准备并锁定所需的行。参与者投票 YES 或 NO。 提交阶段:如果所有参与者都投票了 YES,则管理器向所有节点发出 COMMIT 命令。如果任何节点投票 NO 或超时,它会发出 ROLLBACK。 Client ----> Transaction Manager | +-------------+-------------+ | (Prepare) | (Prepare) | (Prepare) v v v Order DB Payment DB Inventory DB 为什么 2PC 是微服务的反模式 虽然 2PC 保证了强一致性,但由于几个架构缺陷,它在云原生微服务环境中崩溃了:
Microservices
Saga Pattern
Distributed Transactions
Event-Driven Architecture
Kafka
Orchestration
Choreography
System Design