我应该在生产中使用 rails5 ActiveJob 默认异步适配器来进行小型后台作业吗?

Posted

技术标签:

【中文标题】我应该在生产中使用 rails5 ActiveJob 默认异步适配器来进行小型后台作业吗?【英文标题】:Should I use rails5 ActiveJob default async adapter for small background job in production? 【发布时间】:2019-03-11 17:21:30 【问题描述】:

使用外部服务处理和激活许可证的 Rails 应用程序,外部服务有时会将 Rails 请求的处理延迟到 30 秒以上,然后会向前端返回错误(我正在运行 heroku,所以最大值为30 秒)。

我尝试使用 ActiveJobs 和默认的 Rails 异步适配器(Rails 5),我可以看到它在 Heroku 中开箱即用。我一直在阅读,我应该使用另一个 Web 进程,例如 redis,但是如果后台作业应该在请求完成后立即执行,并且如果只是在外部访问另一个可能更慢的 API,那么使用它是否很糟糕默认异步?

我可以看到这是一个进程内线程中的句柄,但我看不出有什么理由让这么小的工作有另一个 Web 进程。

【问题讨论】:

【参考方案1】:

如果对于生产中的小型后台作业,在失败/服务器重启的情况下不需要 100% 的持久性,其持续时间相对较短,因此单独的进程将是一个矫枉过正,我建议使用 Sucker Punch。

Sucker Punch gem 专为处理此类情况而设计。它使用concurrent-ruby gem 为您创建的每个作业准备执行线程池,这(可能)是Ruby 中最强大的并发库。它还挂钩on_exit 来完成所有待处理的任务,所以我猜你可以期望这个gem 比AsyncJob 更可靠。

需要注意的一点是,尽管 Active Job 支持 Sucker Punch,但适配器编写得并不好。或者,至少,当你使用 Sucker Punch 适配器时,它的行为就像async 适配器一样。因此,如果您想要比 AsyncJob 更有用/更强大的东西,我建议您使用裸 Sucker Punch。

【讨论】:

【参考方案2】:

我在生产环境中使用异步适配器发送电子邮件。这是一个非常小的工作。发送一封电子邮件最多可能需要 3 秒。

文档说它不适合生产,因为它会在重新启动时丢弃待处理的作业。如果我没记错的话,Heroku 每天会重启一次 dynos。

如果您的作业在重新启动期间处于挂起状态,则该作业将丢失。就我而言,重启期间待处理的电子邮件非常少。到目前为止一切顺利。

但如果您的作业需要 30 秒,我将使用 Resque 或 DelayedJob。

【讨论】:

以上是关于我应该在生产中使用 rails5 ActiveJob 默认异步适配器来进行小型后台作业吗?的主要内容,如果未能解决你的问题,请参考以下文章

是否应该在生产中禁用弹簧启动/云执行器?

节点:在生产中使用非LTS版本的节点是否很糟糕?

您应该使用 Babel 配置中的 `env` 部分在生产中禁用 react-transform-hmr

与 Flask 捆绑在一起的服务器在生产中使用是不是安全?

Strapi 在生产中给我数据库错误,即使我使用的是正确的凭据

dotenv 在生产中需要 .env 文件