你如何在一个Heroku dyno上运行多个DelayedJob工作者?

时间:2014-07-16 23:15:00

标签: ruby-on-rails heroku delayed-job foreman procfile

我无法让我的dynos运行多个延迟的工作进程。

我的Procfile如下所示:

worker: bundle exec script/delayed_job -n 3 start

我的delayed_job脚本是gem提供的默认脚本:

#!/usr/bin/env ruby

require File.expand_path(File.join(File.dirname(__FILE__), '..', 'config', 'environment'))
require 'delayed/command'
Delayed::Command.new(ARGV).daemonize

当我尝试在本地或Heroku dyno上运行时,它会静静地退出,我无法分辨出发生了什么。

foreman start
16:09:09 worker.1 | started with pid 75417
16:09:15 worker.1 | exited with code 0
16:09:15 system   | sending SIGTERM to all processes
SIGTERM received

任何有关如何调试问题的帮助或有关在单个dyno上运行多个worker的其他方法的建议都将非常感激。

4 个答案:

答案 0 :(得分:14)

您可以使用foreman在同一个dyno上启动多个进程。

首先,将工头添加到您的Gemfile中。

然后在 Procfile

中添加worker
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

这将在你的工作人员dyno上启动3名delayed_job工作人员。

答案 1 :(得分:6)

尝试将Procfile更改为:

worker: bundle exec script/delayed_job -n 3 run

使用start将在后台创建两个守护进程,然后立即退出。 Heroku认为你的过程崩溃了。

使用run可将工作人员置于前台。

更新:我现在使用Delayed Job Worker Pool

答案 2 :(得分:0)

简短的回答是你不能用delayed_job来做这件事。 dyno是一个进程,一个delayed_job工作者可以处理单个进程。

但是还有其他解决方案。如果您可以切换到使用Sidekiq,那么您可以在一个进程上运行相当多的工作人员,因为Sidekiq工作人员使用线程。这里的权衡是你的工人需要线程安全。

检查出来:http://sidekiq.org/

答案 3 :(得分:0)

我试图使用@infused的公认解决方案,但遇到一个问题,工作进程在启动时崩溃 Bundler::GemNotFound: Unable to find a spec satisfying web-console in the set. Perhaps the lockfile is corrupted?

其原因是foreman start默认正在寻找.env文件并读取它:Forman Manual。 因为.env文件是为开发环境设置的,所以工头正在寻找web-console宝石,但缺少它。 结论:如果您看到工作人员没有开始,请检查您是否有一个不适合生产的.env文件,然后重命名该文件或在启动时指定另一个文件。