【问题标题】:Delayed Job workers not running in parallel延迟的作业工作人员未并行运行
【发布时间】:2017-03-20 14:26:10
【问题描述】:

(因删除敏感信息而重新添加)

我们目前有 4 个延迟的作业工作者处理由我们的主应用程序创建的后台作业。这些都是通过新贵脚本与它们自己的实例一起生成的。我们希望这 4 名工作人员同时工作,但是他们现在正在等待对方完成,然后再处理另一项工作。这导致我们的作业池中出现大量积压,因为本质上一次只运行 1 个作业,而不是期望的 4 个。

我尝试过但无济于事的事情:

  • 重启工作器
  • 重启服务器(延迟作业和数据库服务器)
  • 增加工人数量
  • 在不同的池中为不同的作业队列运行工作器
  • 使用两种语法 (script/delayed_job start & bundle exec rake jobs:work) 生成工人

这里有什么我们遗漏的吗?我们怎样才能让工作人员再次并行运行?提前致谢。


Upstart 脚本(使用不同的索引运行 4 次):

instance $index

script
# this script runs in /bin/sh by default
# respawn as bash so we can source in rvm
exec /bin/bash <<'EOT'
  # rvm
  source /home/user/.rvm/scripts/rvm

  cd /home/foo/bar/current
  exec /usr/bin/env RAILS_ENV=production bundle exec rake jobs:work
EOT
end script
  • Ruby 版本:2.3.1
  • Rails 版本:4.2.6
  • 延迟作业版本:4.1.2
  • Ubuntu 版本:14.04.4 LTS
  • 新贵版本:1.12.1
  • 数据库:MariaDB 10.1.21

【问题讨论】:

  • 我们最终完全解雇了延迟工作,转而支持 Sidekiq。抱歉,我无法提出修复建议。

标签: ruby-on-rails ruby delayed-job upstart


【解决方案1】:

对以下陈述有待更正 - 我最近在 AWS 上学习并实施了延迟作业。

在 PROD 中,我根据 https://github.com/collectiveidea/delayed_job 使用 bin/delayed_job 和守护进程 gem

我的应用在 AWS 上,所以启动/重启命令是:

su -s /bin/bash -c "bundle exec bin/delayed_job -n 2 --pid-dir=$EB_APP_PIDS_DIR restart" $EB_APP_USER

rake jobs:work 通常用于在我阅读的各种文章中启动开发环境中的工作人员。

要进一步解决问题,请尝试在 rails 控制台中执行此操作:

Delayed::Worker.new

并检查作业是否得到更快的处理。

要尝试的另一件事: 通过您通常使用的任何脚本停止所有工作人员。 然后做

ps -ef | grep "jobs:work"

查看所有工作进程是否真的被杀死。 如果工作系统进程仍然存在,您必须手动终止这些系统进程。 然后重新启动工作人员并检查行为是否有任何差异。

【讨论】:

  • 感谢您的回复 Pranesha。应该早点更新,但我们最终摆脱了 DelayedJob 以支持 Sidekiq。我们现在已经恢复运行(甚至更快)。
猜你喜欢
  • 2017-04-03
  • 1970-01-01
  • 2012-03-29
  • 2012-02-11
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
  • 2020-03-05
相关资源
最近更新 更多