如何在单个Heroku dyno上运行多个DelayedJob workers?(这是一个关于IT技术的提问标题)

12

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

我的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的其他建议,都将非常感激任何帮助。

5个回答

15

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

首先,在Gemfile中添加foreman。

然后在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

这将在您的 worker dyno 上启动3个 delayed_job workers。


8
尝试将您的Procfile更改为以下内容: worker: bundle exec script/delayed_job -n 3 run 使用“start”将在后台创建两个守护进程,然后立即退出。Heroku认为您的进程已崩溃。
使用“run”可以使工作进程保持前台运行。
更新:现在我使用Delayed Job Worker Pool来做这件事。

是的,我一直在寻找这个。这应该是被接受的答案。 - Vincil Bishop
1
很抱歉要说这个似乎不再起作用了。现在,运行将忽略-n参数并始终运行单个进程。 - DrewB

0

简短的回答是,你不能使用delayed_job来实现这个。一个dyno是一个进程,而单个delayed_job worker只能在一个进程上工作。

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

看看这个:http://sidekiq.org/


0

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文件是为开发环境设置的,因此foreman正在寻找缺失的web-console gem。 结论:如果您发现您的工作进程无法启动,请检查是否有一个不适合生产环境的.env文件,并将其重命名或在启动时指定另一个文件。


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