您如何在单个 Heroku 测功机上运行多个 DelayedJob 工作人员?
Posted
技术标签:
【中文标题】您如何在单个 Heroku 测功机上运行多个 DelayedJob 工作人员?【英文标题】:How do you run multiple DelayedJob workers on a single Heroku dyno? 【发布时间】:2014-09-07 16:00:43 【问题描述】:我无法让我的测功机运行多个延迟的作业工作进程。
我的 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
任何有关如何调试问题的帮助或有关在单个测功机上运行多个工作人员的其他方法的建议,我们将不胜感激。
【问题讨论】:
【参考方案1】:您可以使用工头在同一个测功机上启动多个进程。
首先,将工头添加到您的 Gemfile。
然后将worker
行添加到您的Procfile:
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
这将在您的工作人员测功机上启动 3 个延迟工作工作人员。
【讨论】:
【参考方案2】:尝试将您的 Procfile 更改为:
worker: bundle exec script/delayed_job -n 3 run
使用start
将在后台创建两个守护进程,然后立即退出。 Heroku 认为您的进程崩溃了。
使用run
使工作人员保持在前台。
更新:我现在使用Delayed Job Worker Pool。
【讨论】:
是的,一直在寻找这个。这应该是公认的答案。 很抱歉,这似乎不再起作用了。 Run 现在将忽略 -n 参数并始终运行单个进程。【参考方案3】:简短的回答是你不能用delayed_job 做到这一点。 dyno 是一个进程,单个 delay_job 工作人员在单个进程上工作。
不过,还有其他解决方案。如果您可以切换到使用 Sidekiq,那么您可以在单个进程上运行相当多的工作人员,因为 Sidekiq 工作人员使用线程。这里的权衡是您的工作人员需要是线程安全的。
查看:http://sidekiq.org/
【讨论】:
【参考方案4】:我尝试使用@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
文件并重命名它或在启动时指定另一个文件。
【讨论】:
【参考方案5】:我使用废墟 buildpack 在单个(工人)测功机中运行 Procfile.worker:https://github.com/heroku/heroku-buildpack-runit
【讨论】:
以上是关于您如何在单个 Heroku 测功机上运行多个 DelayedJob 工作人员?的主要内容,如果未能解决你的问题,请参考以下文章