用于作为单个事务执行多个服务器操作的设计模式

时间:2018-07-23 16:57:45

标签: design-patterns stripe-payments saas

假设您有一个SaaS应用,并希望在用户注册时执行以下操作:

  1. 验证他们的姓名,电子邮件等。
  2. 为用户创建一个 Stripe 客户帐户。
  3. 为新的Stripe客户订阅现有的Stripe计划。
  4. 在数据库中创建一个用户记录,其中包含Stripe信息。
  5. 为用户创建一个新会话。
  6. 将用户重定向到您的应用程序的仪表板。

理想情况下,您希望所有这些都在单个事务中发生,即,如果第4步失败,则要撤消第2步和第3步...您不希望没有数据库记录的悬挂Stripe客户和订阅。

您建议采用哪种设计模式使这种多步骤/多服务流程具有事务性?

对于上下文

我正在使用Node中的ES6 Promises实现此多步骤过程-以下伪代码:

async function signup_user_for_trial(req, res) {

  const {email, name, plan, password} = req.body

  if (!isValidEmail(email)) {
    throw new Error(...)
  }

  let customer = await createStripeCustomer(email)
  let subscription = await createSubscription(customer, plan)
  let user = await createDBUser(customer, name, email, password)
  let session = await createSession(req, user)

  return res.redirect('/dashboard')
}

1 个答案:

答案 0 :(得分:0)

我认为我要做的是建立一个表来负责引用交易的所有关键部分。在您的示例中,通过Create a Customer API端点创建客户的步骤#2将产生一个客户ID,而通过Create a Subscription API端点附加计划的步骤#3将产生一个订阅ID。

我的数据库中将有两个表:一个表代表相对于其Stripe客户ID的用户,另一个表代表是否需要“回滚”用户。

通常,您总是会填充用户表。但是,如果您的过程在某处中断,请在“回滚”表中添加一个带有用户ID(或类似名称)的条目和/或一个条目,该条目指示您是否也应回滚任何费用。有一个cron-job定期检查这些条目,以异步地执行一些关键请求:

显然,有很多方法可以做到这一点,但是在我看来,这似乎是最简单的。