通过Capistrano任务启动多个具有特定队列的DelayedJob工作进程

12

我正在研究如何使用delayed_job队列。我发现这个页面概述了各种启动worker的方式,但我想保持当前使用Capistrano的方法:

set :delayed_job_args, "-n 2 -p ecv2.production"
after "deploy:start",  "delayed_job:start"
...

我想知道如何修改delayed_job_args参数以处理生成一个特定队列的工作进程,以及为每个其他任务生成1个工作进程。到目前为止,我只是像这样覆盖每个任务:

namespace :delayed_job do
  task :restart, :roles => :app do
    run "cd #{current_path}; RAILS_ENV=#{rails_env} script/delayed_job -p ecv2.production --queue=export restart"
    run "cd #{current_path}; RAILS_ENV=#{rails_env} script/delayed_job -p ecv2.production restart"
  end
end

...但这样很无聊。有什么建议吗?

2个回答

5

我在我的deploy.rb文件中使用以下设置,将我的工作分成两个队列,并将每个队列隔离为一个独立的工作线程:

namespace :delayed_job do
  task :start, roles: :app do
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i queue_one --queue=one start"
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i queue_two --queue=two start"
  end

  task :stop, roles: :app do
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i queue_one --queue=one stop"
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i queue_two --queue=two stop"
  end

  task :restart, roles: :app do
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i queue_one --queue=one restart"
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i queue_two --queue=two restart"
  end
end

命令中的-i name部分非常重要。这是允许多个delayed_job实例运行的部分。
如果您想将工作程序添加到特定队列,则应像这样展开它们(在这里,我有两个工作程序专门在队列一上,一个工作程序专门在队列二上):
namespace :delayed_job do
  task :start, roles: :app do
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i one1 --queue=one start"
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i one2 --queue=one start"
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i two --queue=two start"
  end

  task :stop, roles: :app do
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i one1 stop"
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i one2 stop"
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i two stop"
  end

  task :restart, roles: :app do
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i one1 --queue=one restart"
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i one2 --queue=one restart"
    run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i two --queue=two restart"
  end
end

4
经过一番折腾,我发现的诀窍是回到“set :delayed_job_args”并使用--queues=(复数)而不是--queue=(单数)。希望这能帮助遇到同样问题的其他人。
set :delayed_job_args, "-n 2 -p ecv2.production --queues=cache,export"

更新:我现在使用的是...

after "deploy:stop",    "delayed_job:stop"
after "deploy:start",   "delayed_job:start"
after "deploy:restart", "delayed_job:restart"

namespace :delayed_job do
  # See 'man nice' for details, default priority is 10 and 15 is a bit lower
  task :start, :roles => :app do
    run "cd #{current_path}; #{rails_env} nice -n 15 ruby script/delayed_job -n 1 -p yourapp.#{application} start"
  end

  task :restart, :roles => :app do
    stop
    start
  end
end

这只是启动了两个处理相同两个队列的工作进程,不是你要求的内容。 - RocketR
不是我所期望的,但那时候是我能想到的最好方案。 - Chuck Bergeron
我明白了。我按照你在问题中写的方式为每个队列使用了单独的命令。似乎DJs Capistrano任务并不适用于多个队列。 - RocketR
如果你的run命令使用了bundle exec,那么nice -n 15应该放在哪里(在bundle execruby script/delayed_job之间还是之后)? - James Chevalier

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