Подтвердить что ты не робот

Запуск нескольких сотрудников DelayedJob с отдельными очередями через задачи Capistrano

Я ищу использование очередей с задержкой_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

... Но это не весело. Любые предложения?

4b9b3361

Ответ 1

Я разделил свои задания на две очереди с одним рабочим, изолированным для каждой очереди, с этой настройкой в ​​моем файле 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

Ответ 2

После немного беспорядочного трюка, который я нашел, нужно было вернуться к "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