Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 作为单个事务执行多个服务器操作的设计模式_Design Patterns_Stripe Payments_Saas - Fatal编程技术网

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

Design patterns 作为单个事务执行多个服务器操作的设计模式,design-patterns,stripe-payments,saas,Design Patterns,Stripe Payments,Saas,假设您有一个SaaS应用程序,并希望在用户注册时执行以下操作: 验证他们的姓名、电子邮件等 为用户创建条带客户帐户 向新的条带客户订阅现有条带计划 在数据库中创建包含条带信息的用户记录 为用户创建新会话 将用户重定向到应用程序的仪表板 理想情况下,您希望所有这些都发生在单个事务中,即如果步骤4失败,您希望撤消步骤2和3…您不希望出现没有DB记录的挂起条带客户和订阅 您建议采用什么设计模式来实现这种多步骤/多服务流程的事务性 上下文 我在下面的节点伪代码中使用ES6承诺实现这个多步骤过程: asy

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

  • 验证他们的姓名、电子邮件等
  • 为用户创建条带客户帐户
  • 向新的条带客户订阅现有条带计划
  • 在数据库中创建包含条带信息的用户记录
  • 为用户创建新会话
  • 将用户重定向到应用程序的仪表板
  • 理想情况下,您希望所有这些都发生在单个事务中,即如果步骤4失败,您希望撤消步骤2和3…您不希望出现没有DB记录的挂起条带客户和订阅

    您建议采用什么设计模式来实现这种多步骤/多服务流程的事务性

    上下文 我在下面的节点伪代码中使用ES6承诺实现这个多步骤过程:

    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')
    }
    

    我想我要做的是构建一个表,负责引用事务的所有关键部分。在您的示例中,步骤2通过API端点创建客户将生成客户ID,步骤3通过API端点附加计划将生成订阅ID

    在您的数据库中有两个表:一个表示您的用户相对于其客户ID的状态,另一个表示用户是否需要“回滚”

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


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

    使用cron作业定期协调失败操作的日志是一个有趣的想法。经过一段时间的思考,我得出结论,除了手动保存日志之外,没有什么“聪明”的方法可以做到这一点……就像实际的DBMS对事务所做的那样。谢谢@korben。