有人在Heroku Dyno上运行多个Resque Worker吗?

5
考虑到独角兽通常管理多个Rails服务器进程,并且Resque作业运行器可能比Web请求消耗更少的资源,因此在单个Heroku dyno上运行多个resque worker应该是可能的。目前有人成功这样做吗?我的想法是,一种简单的方法是Procfile运行foreman,然后运行2(或更多)实际worker的实例(即rake resque:work)。或者rake resque:workers能胜任这项任务吗?Resque本身不建议使用该方法,因为这会在并行线程中而不是并行进程中启动工作程序。显然,这只对I/O绑定的作业有意义。
2个回答

8

您可以使用Foreman来启动多个进程。将Foreman添加到您的Gemfile中,然后创建两个文件:

Procfile

worker: bundle exec foreman start -f Procfile.workers

Procfile.workers:

worker_1: QUEUE=* bundle exec rake resque:work
worker_2: QUEUE=* bundle exec rake resque:work

同样的技术可以用于在一些工作程序旁边运行Web服务器。

注意:虽然许多人使用这种方法取得了成功,但我不建议在小型Heroku实例上使用它,主要是因为存在内存限制的风险;而且一旦您为Heroku服务付款,最好还是直接启动专用的工作机器。


太棒了!我刚刚使用了同样的技术,在单个工作 dyno 上启动了多个 delayed_job 进程。 - Yarin
Heroku是否监控由Procfile.workers文件启动的进程?这是不使用resque的COUNT=2设置的核心问题。 - ajsharma
我想,如果其中一名工人死亡,运行“Procfile.workers”的领班应该杀死所有子进程并终止自身 - 然后这应该对heroku可见。我曾经在没有问题的情况下运行上述设置一段时间,但最终决定只使用heroku的默认设置。 - radiospiel
如果我按照步骤操作,Heroku会缓存进程。此外,Foreman gem提到:“Ruby用户应该注意不要在项目的Gemfile中安装Foreman。” - Bot
嗨@Bot:好的,这是你要的内容。首先,如果Heroku“崩溃”了进程,那么你的应用很可能超过了RAM使用限制。由于此方法启动的进程比Heroku通常从Procfile启动的进程多,因此这将使RAM需求倍增,因此您可能会遇到小型Heroku实例所暴露的512 MB限制。 - radiospiel
其次:“Ruby用户应该注意不要在项目的Gemfile中安装foreman。”好吧,在heroku机器上安装foreman的唯一方法是使用Gemfile(当然,你也可以使用buildpack,但那是另一回事了)。 - radiospiel

1
根据this article所述,似乎是可能的,但最大的难点在于,如果其中一个子进程死亡,Heroku 将无法重新启动它。

谢谢你的努力。我找到了一种更容易构建且可能更稳定的方法 - 请参见上文。 - radiospiel

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