SAGA设计模式浅析

SAGA模式是一种设计模式,它是一个长期存在的较小事务序列。此模式用于管理和维护跨多个微服务的数据一致性。每个事务都由单个服务执行,状态更改会广播到 Saga 中涉及的其他服务。它通过为传统的ACID事务模型提供替代方法来帮助维护数据一致性,而传统的ACID事务模型在分布式环境中可能不可行。

SAGA模式的特点

  1. 协调事务: SAGA 模式提供了一种协调涉及多个服务或进程的事务的方法。该模式定义了一系列步骤,每个步骤都可以涉及一个单独的服务或流程,这些步骤以协调的方式执行以完成交易。
  2. 补偿和回滚: SAGA 模式包括一种机制,用于在其中一个步骤失败时补偿或回滚事务。这种机制确保事务保持一致,即使一个或多个步骤失败。
  3. 分布式事务: SAGA 模式支持跨越多个服务或进程的分布式事务。该模式提供了一种以一致的方式协调跨这些服务或流程的事务的方法。
  4. 异步处理: SAGA 模式可以支持异步处理,从而获得更高的并发性和性能。这在不同服务或进程的处理时间可能不同的分布式系统中尤为重要。
  5. 错误处理:SAGA 模式提供了一种标准化的方式来处理事务期间发生的错误。该模式确保在事务中涉及的所有服务或流程中一致地处理错误。
  6. 可扩展性: SAGA 模式可以扩展以处理涉及多个服务或流程的大型复杂事务。该模式提供了一种将事务分解为更小、更易于管理的步骤的方法,这些步骤可以跨不同的服务或流程并行执行。

让我们看一个 SAGA 模式在实践中如何工作的例子。考虑一个允许用户购买产品的电子商务应用程序。下订单时,必须处理付款,必须检查和保留卖家的库存,最后必须发货。如果这些步骤中的任何一个失败,则应回滚整个订单。

为了实现该模式,我们可以为上述每个功能创建一个单独的服务。它必须以这样一种方式设计,即所有这些事务都相互同步。

此类网站的典型流程应如下所示:

  1. 开始订单:开始订单传奇并在数据库中创建一个新订单。
  2. 处理付款:尝试从用户的借记卡/信用卡中扣款。如果成功,则在数据库中将订单标记为已付款。如果不成功,取消订单并回滚之前的任何步骤。
  3. 检查库存:检查订单中的商品是否有库存。如果不是,请取消订单并回滚之前的所有步骤。
  4. 保留库存:保留订单中的项目。如果不成功,取消订单并回滚之前的任何步骤。
  5. 发货订单:在数据库中将订单标记为已发货。

很明显,每一步都依赖于它的前一步。每个步骤都将作为单独的服务实施。当一个步骤成功完成时,它会向下一步发送一条消息。如果某个步骤失败,它会向上一步发送一条消息,以回滚到目前为止所做的任何更改。

图片[1] - SAGA设计模式浅析 - 技术SOLO

SAGA

执行:

以下是如何为流程实现 SAGA 模式的概述:

1. Begin Order:当一个新的订单被发起时,创建一个新的saga实例并存储在数据库中。saga 实例应包含执行订单流程所需的所有数据,例如用户信息和订单详细信息。saga 的第一步是在数据库中创建一个新订单。

2.处理付款: saga 的下一步是处理付款。如果支付成功,更新 saga 实例以在数据库中将订单标记为已支付。如果支付失败,saga 应该触发一个补偿步骤来取消订单并回滚之前的任何步骤。

3.检查库存:付款成功后,下一步就是检查库存,查看订单中的所有商品是否有货。如果任何商品缺货,saga 应触发补偿步骤以取消订单并回滚之前的任何步骤。

4.预留库存:如果所有商品都有货,下一步就是为订单预留库存。如果由于任何原因无法保留库存,saga 应触发补偿步骤以取消订单并回滚之前的任何步骤。

5.发货订单:传奇中的最后一步是发货订单。如果订单已付款,所有物品都可用,并且库存已保留,则在数据库中将订单标记为已发货。如果前面的任何步骤失败,saga 应该触发适当的补偿步骤来取消订单并回滚任何前面的步骤。

事件用于协调跨多个服务或流程的订单流程的不同步骤。例如,负责处理支付的服务可以在成功处理支付时发布一个事件。负责将订单标记为已付款的服务可以使用此事件,该服务又可以发布订单已付款事件。负责保留库存的服务可以使用此事件,该服务可以发布库存保留事件。负责运送订单的服务可以使用此事件,该服务可以发布订单运送事件以更新数据库中的订单状态。

SAGA模式的优缺点

SAGA模式的优势 SAGA模式的缺点
提供更好的容错能力:使用SAGA,如果一个步骤失败,整个过程可以回滚或补偿,而不影响其他步骤。 复杂性增加:实施 SAGA 需要额外的编码和架构来处理补偿和回滚步骤。
简化错误处理:SAGA 提供了一种清晰和标准化的方式来处理错误和补偿,从而更易于调试和维护。 有限支持:并非所有框架或平台都支持开箱即用的 SAGA,这会使实施更加困难。
允许异步处理:SAGA 可以支持异步处理,允许更高的并发性和性能。 需要仔细设计:SAGA 模式需要仔细设计,以确保正确实现补偿和回滚,并能够处理所有可能的故障场景。
支持分布式事务:SAGA 可以处理跨多个服务或数据库的事务,允许更具可扩展性和分布式架构。 延迟增加:由于需要在不同的服务或数据库之间进行协调,SAGA 可能会导致额外的延迟。

总的来说,SAGA 模式是管理分布式事务和提供容错的强大工具。但是,它需要仔细的设计和实施,以确保它得到有效使用,并且不会引入额外的复杂性或延迟。

© 版权声明
THE END
喜欢就支持一下吧
点赞0打赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容