1

在我的 Rails 应用程序中,用户可以取消他们的订阅,这应该会触发一个函数来降级他们的帐户current_billing_period_end(这个变量由支付提供商的 API 提供)。例如,用户在 4 月 12 日取消了订阅,但在 3 月 1 日之前订阅有效。因此premium,该用户在数据库中的条目应设置为false仅在 3 月 1 日。

我已经使用 Resque 和 Resque-Scheduler 实现了一个可行的解决方案,但现在想知道这是否有点矫枉过正?

我可以subscription_end_date在取消订阅时为用户设置一个数据库条目并将其设置为current_billing_period_end然后每当用户进行身份验证时我都会运行

if user.premium != false && user.subscription_end_date == Time.now.strftime("%Y-%m-%d")
  user.premium = false
  user.save
end

但是,这意味着每次用户进行身份验证时都运行该代码段/前端检查用户是否通过我的 API 登录。

我的问题是:实现该功能的更好方法是什么?Resque 解决方案似乎更干净,但我想知道对于我在这里想要实现的目标是否太多/征税。我以前从未与 Resque 合作过,如果这是我不必在生产中维护的另一件事,我会很高兴。

4

1 回答 1

2

不要那样做。

将许多作业安排在几天或几周后是一个糟糕的设计,尤其是当他们执行一项关键任务时。

为什么?

主要是因为计划作业的日期不是存储在您的应用程序数据库中,而是另一个,大部分时间在 Redis 中。在大多数情况下,它不包含在备份中。因此,在您需要恢复备份的那一天,您将丢失所有挂起的计划作业。在最后一个订阅期结束时未决的所有帐户可能会保持打开状态。

最安全的解决方案是依赖保存订阅日期实际结束的数据库字段。让我们命名它subscription_ends_on。如果您的用户在 4 月 12 日退订,则您设置subscription_ends_on的值为“3 月 1 日”。

然后,您创建一个每天午夜运行的后台作业,并取消订阅subscription_ends_on不为空且小于或等于今天的所有帐户。

于 2021-02-23T18:48:29.060 回答