Node.js 中的 Saga 模式

2025年3月18日 | 阅读时长 4 分钟

Saga 模式 也是一种设计模式,可用于处理微服务架构中的分布式事务。它确保一系列操作(可能分布在不同的服务中)能够正确执行;如果不能,则会启动一系列补救措施来撤销不必要的更改。

在 Node.js 中,实现 Saga 模式可以让我们处理事务,即使在操作扩展的情况下,这对于管理分布式系统(尤其是在使用基于事件的结构时)来说也是一项可靠的工作。

语法

Node.js 的预期实现竟然缺失!Saga 模式没有内置实现。因此,通常建议使用 `node-sagas` 等库,或者为应用程序编写独立的代码来实现。

以下是使用 JavaScript 类和事件发射器实现 Saga 模式的常用方法

参数

  • Step: 以要执行的函数形式调用事务的某个步骤。
  • Compensation: 一个函数,说明如果某个步骤失败,回滚机制将如何执行。
  • Execute(): 此方法按顺序处理所有步骤,然后在失败时调用回滚过程。
  • Rollback(): 当识别到故障时,此方法以向后方式执行补偿操作。

示例及输出

以下是使用 Saga 类跨多个服务(例如,订单放置、付款处理和发货)执行分布式事务的示例

输出

 
Order placed successfully.
Payment processed successfully.
Error occurred, rolling back... Error: Payment failed
Compensating shipment: canceling shipment.
Compensating payment: refunding payment.
Compensating order: canceling order.
Rollback completed.   

说明

如果在 `paymentProcessing` 步骤中发生错误,将启动 Saga 模式,进行回溯,并撤销失败的步骤。

优点

Node.js 中 Saga 模式的几个优点如下

  • 弹性: Saga 模式还确保服务不会提供不一致的数据,因为在模式的某个步骤失败的情况下不会触发回滚机制。
  • 可扩展性: 它在分布式/微服务和分解大型 TTX 方面非常高效,这是一个巨大的优势。
  • 异步执行: WS-* 的重要特性之一是它支持异步事务管理,这非常适合事件驱动的系统。
  • 减少锁定: 与其他类型的事务(它们使用锁)相反,Saga 模式使用补偿步骤,从而防止资源阻塞。

用例

Node.js 中 Saga 模式的几个用例如下

  • 订单管理: 协调任务阶段,例如订购产品/服务、付款以及在服务中更新库存。
  • 金融系统: 管理资金转账、付款、收费和退款,其中事务发生在服务之间。
  • 预订系统: 预订和预订酒店、航班和汽车,并在与服务提供商的初始服务出现问题时能够回滚。
  • 电子商务: 结账和其他可以分解为多个步骤的操作,例如,购买管理、订单和发货服务。
  • 具有分布式数据库的微服务: 服务可以访问分散环境中的多个数据库,必须保证一致性。
  • 事件溯源: 在事件溯源是给定系统中数据管理的基本手段的情况下,检测和缓解事件流中的变化。

结论

总之,Saga 模式被认为是 Node.js 中执行分布式事务的解决方案之一,这在微服务架构的案例中非常明显。通过将大量工作分解为小的顺序步骤,并在某个步骤失败时提供补偿操作,它提供了一个健壮的解决方案来确保跨服务的 D 数据完整性。值得一提的是,Saga 模式在 Node.js 中没有原生支持。可以使用或实现库,或者从头开始创建自己的编排。