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