SAGA 设计模式是一种用于管理长运行事务和分布式事务的模式,特别是在微服务架构中。与传统的单一事务不同,后者需要一个单一的中心化事务管理系统,而 SAGA 模式将一个复杂的事务分解为一系列较小的、隔离的操作,每个操作由不同的服务处理。
!<a href="https://media.geeksforgeeks.org/wp-content/uploads/20241108164412754920/saga-design-patterns.webp">saga-design-patternsSAGA 设计模式
目录
- 什么是分布式事务?
- 什么是用于分布式事务管理的 2PC?
- 传统分布式事务协议的问题
- 什么是 SAGA 设计模式?
- 为什么我们需要 SAGA 设计模式?
- SAGA 设计模式是如何工作的?
- SAGA 设计模式示例
- 实现 SAGA 设计模式的方法
- SAGA 模式的优缺点
什么是分布式事务?
分布式事务是指涉及多个独立系统或数据库的事务,这些系统或数据库通常分布在不同的位置或网络中,它们需要协同工作以完成一项任务。这就像是一个协调的团队努力,每个系统处理一小部分工作,但它们都必须成功完成各自的任务,整个事务才能被视为成功。
例如,想象一下您正在在线购物。该交易可能涉及:
- 您的银行检查您是否有足够的资金。
- 电商平台为您购买的产品进行库存预留。
- 物流服务准备发送您的物品。
- 仓库更新其库存水平。
什么是用于分布式事务管理的 2PC?
2PC (Two-Phase Commit,两阶段提交) 是一种协议,用于确保分布式事务中的所有参与者要么都提交,要么都中止,从而保证一致性。在第一阶段,协调器询问所有参与者是否同意提交;在第二阶段,参与者投票决定提交还是中止事务。
传统分布式事务协议的问题
传统的分布式事务协议(如两阶段提交 2PC)在现代系统中存在局限性,主要原因如下:
- 阻塞性质:如果在发起事务后协调器发生故障,参与者可能会无限期地等待,从而导致延迟。
- 单点故障:协调器对于决策至关重要。如果它崩溃,整个事务可能会卡住,从而影响可靠性。
- 网络分区:如果网络发生分裂,某些节点可能无法收到最终决定,导致状态不一致(即某些节点可能提交了,而其他节点没有),这会导致数据不一致。
这些问题使得 2PC 不适用于现代的、高可用的且具有容错能力的系统。
什么是 SAGA 设计模式?
SAGA 设计模式是一种用于管理微服务架构中长运行、分布式事务的模式。
- 它不再依赖于传统的单一事务(这需要跨服务锁定数据库),而是将事务分解为一系列较小的、独立的操作,每个操作属于不同的服务。
- 这些较小的操作也称为 Saga 步骤,它们按顺序或并行执行,每一步都针对其他步骤中可能发生的故障进行补偿。
为什么我们需要 SAGA 设计模式?
我们需要 SAGA 是因为 2PC 虽然简单,但在对可用性和容错性至关重要的分布式系统中效果并不好。在现实世界的系统中,网络故障、崩溃恢复和长运行事务是很常见的,而 2PC 的阻塞行为和对单一协调器的依赖会导致系统不可靠且缓慢。SAGA 提供了一种更灵活、去中心化的方法来管理长运行的分布式事务。
> SAGA 通过将事务分解为较小的、独立的步骤,解决了 2PC 的局限性,每个步骤都有相应的补偿操作以应对出错情况。以下是它解决 2PC 关键问题的方法:
- 非阻塞:与 2PC 不同(它在事务完成前阻塞参与者),SAGA 允许每个步骤独立执行,避免了因协调器故障导致的延迟。
- 无单点故障:SAGA 不依赖中心协调器。每个步骤都是独立的,因此如果一个步骤失败,它不会阻塞整个过程。
- 优雅的故障处理:与 2PC 不同(回滚整个事务),SAGA 使用补偿操作来撤消发生故障时已成功的步骤,确保系统保持一致。
- 对网络分区的弹性:即使部分网络发生故障,SAGA 也能继续运行,因为每个步骤都是独立的。