将多个服务器操作作为单个事务执行的设计模式
Design Patterns for Performing Multiple Server Operations as a Single Transaction
假设您有一个 SaaS 应用程序并希望在用户注册时执行以下操作:
- 验证他们的姓名、电子邮件等
- 为用户创建一个 Stripe 客户帐户。
- 为新的 Stripe 客户订阅现有的 Stripe 计划。
- 在您的数据库中创建一条包含 Stripe 信息的用户记录。
- 为用户创建一个新会话。
- 将用户重定向到您应用的仪表板。
理想情况下,您希望所有这些都在单个事务中发生,即如果第 4 步失败,您想要撤消第 2 步和第 3 步...您不希望没有数据库记录的悬空 Stripe 客户和订阅。
您会推荐哪些设计模式来使这样的 multi-step/multi-service 流程具有事务性?
对于上下文
我在 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')
}
我想我要做的是构建一个 table 负责引用交易的所有关键部分。在您的示例中,第 2 步通过 Create a Customer API Endpoint will yield a Customer ID and Step #3 attaching a plan via the Create a Subscription API 端点创建客户将产生订阅 ID。
我会在你的数据库中有两个 table:一个代表你的用户相对于他们的 Stripe 客户 ID,另一个代表用户是否需要 "rolled back"。
一般来说,您总是会填充用户 table。如果您的流程在某处中断,请使用用户 ID(或类似内容)向 "roll back" table 添加一个条目 and/or 一个指示您是否也应该回滚任何费用的条目。有一个 cron-job 定期检查这些条目以异步执行一些关键请求:
显然有很多方法可以做到这一点,但在我看来这似乎是最简单的。
假设您有一个 SaaS 应用程序并希望在用户注册时执行以下操作:
- 验证他们的姓名、电子邮件等
- 为用户创建一个 Stripe 客户帐户。
- 为新的 Stripe 客户订阅现有的 Stripe 计划。
- 在您的数据库中创建一条包含 Stripe 信息的用户记录。
- 为用户创建一个新会话。
- 将用户重定向到您应用的仪表板。
理想情况下,您希望所有这些都在单个事务中发生,即如果第 4 步失败,您想要撤消第 2 步和第 3 步...您不希望没有数据库记录的悬空 Stripe 客户和订阅。
您会推荐哪些设计模式来使这样的 multi-step/multi-service 流程具有事务性?
对于上下文
我在 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')
}
我想我要做的是构建一个 table 负责引用交易的所有关键部分。在您的示例中,第 2 步通过 Create a Customer API Endpoint will yield a Customer ID and Step #3 attaching a plan via the Create a Subscription API 端点创建客户将产生订阅 ID。
我会在你的数据库中有两个 table:一个代表你的用户相对于他们的 Stripe 客户 ID,另一个代表用户是否需要 "rolled back"。
一般来说,您总是会填充用户 table。如果您的流程在某处中断,请使用用户 ID(或类似内容)向 "roll back" table 添加一个条目 and/or 一个指示您是否也应该回滚任何费用的条目。有一个 cron-job 定期检查这些条目以异步执行一些关键请求:
显然有很多方法可以做到这一点,但在我看来这似乎是最简单的。