使用外部服务处理和激活许可证的应用程序运行,该外部服务有时会将对Rails请求的处理延迟到30秒以上,然后将错误返回到前端(我正在运行heroku,所以max 30s)。
我尝试使用ActiveJobs和默认的Rails异步适配器(Rails 5),并且可以看到它在Heroku中是开箱即用的。我一直在读我应该使用另一个Web进程,例如redis,但是如果后台作业应该在请求完成后立即执行,并且如果只是在另一个API之外运行,这可能会比较慢,那么使用起来是否很糟糕默认异步?
我可以看到这是一个进程内线程中的句柄,但是我看不到有这么小的工作需要另一个Web进程的原因。
答案 0 :(得分:1)
我在生产中使用异步适配器发送电子邮件。这是一项非常小的工作。一封电子邮件最多可能需要3秒钟才能发送。
医生说这不适合生产,因为它将在重启时丢弃待处理的作业。如果我没记错的话,Heroku每天重启一次测功机。
如果您的作业在重新启动过程中处于挂起状态,则该作业将丢失。就我而言,重新启动期间的待处理电子邮件非常少。到目前为止一切顺利。
但是,如果您的工作需要30秒,我将使用Resque或DelayedJob。
答案 1 :(得分:0)
如果对于生产中的小型后台作业,如果在发生故障/服务器重新启动时不需要100%的持久性,并且持续时间相对较短,那么单独进行处理将是一个过大的选择,我建议使用Sucker Punch
Sucker Punch宝石旨在处理此类情况。它使用concurrent-ruby
gem(可能是Ruby中最强大的并发库)为您创建的每个Job准备执行线程池。它还会钩住on_exit
来完成所有待处理的任务,因此我猜您可以期望这个gem比AsyncJob更可靠。
要注意的一件事是,尽管Active Job支持Sucker Punch,但适配器的书写方式并不好。或者至少,当您使用Sucker Punch适配器时,它的行为就像async
适配器一样。因此,如果您只想要比AsyncJob有用/稳健的东西,我建议您使用裸露的Sucker Punch。