如何以类似事务的方式访问多个远程服务

How to access multiple remote services in transaction-like manner

我有一个端点负责创建付费订阅。但是,为了创建订阅,我需要连续访问多个不同的服务:

1) 使用前端提供的令牌创建订阅(由前端应用直接调用支付系统生成)(调用支付系统)

2) 获取账单信息以保存在数据库中(调用支付系统)

3) 保存一些账单信息(f_name、l_name)并提供送货信息(调用数据库)

4) 为客户订阅邮件列表(致电电子邮件服务提供商)

由于服务不可用、DC 中的互联网连接问题或开发人员无法控制的任何其他问题,这些步骤中的任何一个都可能失败。是否有任何选项可以以类似事务的方式处理所有这些以避免部分完成?例如我们创建订阅,但不写入数据库。

如果有帮助,我正在使用 Node.js。

查看微服务的 Saga pattern。这基本上可以布置为您在要创建订阅时联系的服务。它知道涉及的每个步骤,最重要的是,它还知道如何回滚每个事务,以防任何步骤失败。

发出请求后,该服务将开始执行所有必要的操作 requests/queries 然后:

  1. Return成功
  2. 回滚到目前为止发生的所有事务和return一个错误

这显然依赖于您的所有服务都能够恢复到已知的良好状态。

另一种方法是使用 two-phase/n-phase 提交,但它们可能会导致性能大幅下降,这对于面向用户的内容来说是不可取的。

您可能需要通读 this discussion on HackerNews,其中更详细地讨论了这个问题。