Запуск нескольких рабочих DelayedJob с конкретными очередями с помощью задач Capistrano - PullRequest
12 голосов
/ 02 марта 2012

Я изучаю использование очередей с delayed_job. Я нашел эту страницу , в которой описываются различные способы начала работы, однако я бы хотел сохранить свой метод Capistrano:

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

Мне было интересно, как я могу изменить 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

... Но это не весело. Есть предложения?

Ответы [ 2 ]

5 голосов
/ 11 апреля 2014

Я разделил свои задания на две очереди, по одному рабочему, изолированному для каждой очереди с помощью этой настройки в моем файле 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 голосов
/ 29 марта 2012

После небольшого возни, я обнаружил, что уловка заключается в том, чтобы вернуться к '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
...