通过Capistrano任务启动多个具有特定队列的DelayedJob worker

Chu*_*ron 12 ruby ruby-on-rails delayed-job ruby-on-rails-3

我正在研究使用delayed_job的队列.我发现这个页面概述了各种启动工人的方法,但我想保留目前的Capistrano方法:

set :delayed_job_args, "-n 2 -p ecv2.production"
after "deploy:start",  "delayed_job:start"
...
Run Code Online (Sandbox Code Playgroud)

我想知道如何修改delayed_job_args来处理具有特定队列的产生1工作者,以及为每个其他工作处理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
Run Code Online (Sandbox Code Playgroud)

......但那没什么好玩的.有什么建议?

Jam*_*ier 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
Run Code Online (Sandbox Code Playgroud)

-i name命令的一部分非常重要.这是允许多个delayed_job实例运行的部分.

如果你想将工作者添加到特定的队列,那么你可以像这样扩展它们(我在队列1中只有两个工人,而在队列2上只有一个工人):

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
Run Code Online (Sandbox Code Playgroud)


Chu*_*ron 4

经过一番混乱后,我发现的技巧是恢复到“set :delayed_job_args”并使用 --queues= (复数)而不是 --queue= (单数)。希望这对遇到同样问题的其他人有所帮助。

set :delayed_job_args, "-n 2 -p ecv2.production --queues=cache,export"
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)