我们有一个Rails应用程序,其中某些请求在具有delayed_job的worker dyno上触发长时间运行的任务,而前端轮询直到它收到结果。
我们的流量虽小但增长很快,而且任务通常只需几秒钟即可完成,但可能需要一分钟。现在,每个web和worker dyno都足以处理我们的负载。
问题是,delayed_job队列不会并行处理作业,因此较长的任务最终会阻止其背后的任务。
我们正在寻找的是类似于后端的Unicorn,其中单个工作人员dyno可以同时处理多个任务。因为它是Rails,我们正在寻找多进程而不是多线程的东西。
(我们尝试在procfile中创建多个worker条目 - 这在本地dev框中有效,但在Heroku上没有用)
Procfile:
web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
# Multiple workers defined here doesn't translate into multiple processes on single worker dyno:
worker: bundle exec rake jobs:work
worker: bundle exec rake jobs:work
worker: bundle exec rake jobs:work
这篇Heroku文章建议使用resque-pool gem作为解决方案。这是唯一的解决方案,还是delayed_job也可用于并行后台作业?
答案 0 :(得分:5)
根据@ radiospiel的related post,你可以使用工头来启动多个进程。
1)将工头添加到您的Gemfile
2)创建两个文件:
<强> Procfile:强>
web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
worker: bundle exec foreman start -f Procfile.workers
<强> Procfile.workers:强>
dj_worker: bundle exec rake jobs:work
dj_worker: bundle exec rake jobs:work
dj_worker: bundle exec rake jobs:work
我刚把它部署到Heroku,效果很好。