我应该在生产环境中使用Rails 5 ActiveJob的默认异步适配器来处理小型后台作业吗?

7

这是一个处理许可证激活的Rails应用程序,使用外部服务进行处理。外部服务有时会延迟Rails请求的处理时间超过30秒,这将使前端返回错误(我正在运行heroku,因此最大为30秒)。

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

我可以看到这在一个进程线程中处理,但我不认为一个如此简单的任务需要再开启另一个web进程。

2个回答

4
我在生产环境中使用异步适配器来发送电子邮件。这是一项非常小的工作。发送电子邮件可能需要多达3秒钟。
文档中说它不适合用于生产,因为在重新启动时它会丢失等待处理的作业。如果我没记错的话,Heroku每天会重新启动dynos。
如果您的作业在重新启动期间处于等待状态,则该作业将丢失。对于我的情况,重新启动期间等待的电子邮件几乎没有。到目前为止一切顺利。
但是如果您的作业需要30秒钟,我会使用Resque或DelayedJob。

2

如果在生产环境中有一些小的后台作业,不需要100%的持久性以防失败/服务器重启,其持续时间相对较短,因此单独的进程会过度。我建议使用Sucker Punch

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

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


从Sucker Punch Readme中:"sucker_punch和ActiveJob::QueueAdapters::AsyncAdapter有什么区别?目前没有太大区别。SuckerPunch在ActiveJob之前存在,但最终在内部使用了类似的代码。如果你在使用Rails,我建议使用AsyncAdapter。" - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接