2013-07-28 3 views
0

Зачем нам нужно прекратить поиск работника при развертывании кода на сервере?рубины на рельсах останавливают работника resque при развертывании на сервер

Это часть моего файла развертывания. Я обнаружил, есть возможная ошибка в кодах:

namespace :resque do 
    desc "Start resque workers" 
    task :start do 
    # Start two workers with separate run commands, so we can store their PIDs 
    # Hacky, but works 
    run "if [ ! -e #{deploy_to}/shared/pids/resque_production_1.pid ]; then cd #{deploy_to}/current && RAILS_ENV=production QUEUE=* PIDFILE=#{deploy_to}/shared/pids/resque_production_1.pid BACKGROUND=yes VERBOSE=1 bundle exec rake environment resque:work; fi;" 
    run "if [ ! -e #{deploy_to}/shared/pids/resque_production_2.pid ]; then cd #{deploy_to}/current && RAILS_ENV=production QUEUE=* PIDFILE=#{deploy_to}/shared/pids/resque_production_2.pid BACKGROUND=yes VERBOSE=1 bundle exec rake environment resque:work; fi;" 
    end 

    desc "Stop resque workers" 
    task :stop do 
    run "if [ -e #{deploy_to}/shared/pids/resque_production_2.pid ]; then echo \"Killing Worker #1\"; kill -s QUIT `cat #{deploy_to}/shared/pids/resque_production_2.pid`; rm -f #{deploy_to}/shared/pids/resque_production_2.pid; echo \"Done\"; fi;" 
    run "if [ -e #{deploy_to}/shared/pids/resque_production_2.pid ]; then echo \"Killing Worker #2\"; kill -s QUIT `cat #{deploy_to}/shared/pids/resque_production_2.pid`; rm -f #{deploy_to}/shared/pids/resque_production_2.pid; echo \"Done\"; fi;" 
    end 

Кажется, есть некоторые ошибки:

# stop resque worker 

/resque_production_2.pid 

оба они убивают /resque_production_2.pid ... Это означает, что один из работника не убит во время развертывания ... Как вы думаете, это может вызвать проблемы ...

Поскольку я недавно обнаружил, что одно из моих заданий resque не может быть поставлено в очередь в очереди на рабочем сервере. И не показывая неудачу в списке. Может ли это быть причиной этого ?. Но он отлично работает на промежуточном сервере. Кроме того, другие рабочие запросы на рабочем сервере могут работать нормально. Это очень странно.

ответ

0

Работники Resque перезапускаются во время развертывания, чтобы убедиться, что в рабочем состоянии работает последняя версия вашего кода (как правило, модели и рабочие). Неспособность перезапустить рабочего означает, что у работника выполняется проверка вашего кода, с которого он был в последний раз запущен; если вы значительно изменили функциональные возможности, тогда вы можете запускать код, который будет ломать или иным образом вводить ошибки, поскольку ваш текущий код может быть несовместим с версией кода, который он запускает.

Как и в стороне, что-то вроде следующего вида поможет избежать ошибок, как это в будущем (а также позволяют добавлять дополнительные рабочие только приращение верхней границы):

WORKER_COUNT = 2 

task :start do 
    # Start n workers with separate run commands, so we can store their PIDs 
    1.upto(WORKER_COUNT) do |i| 
    run "if [ ! -e #{deploy_to}/shared/pids/resque_production_#{i}.pid ]; then cd #{deploy_to}/current && RAILS_ENV=production QUEUE=* PIDFILE=#{deploy_to}/shared/pids/resque_production_#{i}.pid BACKGROUND=yes VERBOSE=1 bundle exec rake environment resque:work; fi;" 
    end 
end 

desc "Stop resque workers" 
task :stop do 
    1.upto(WORKER_COUNT) do |i| 
    run "if [ -e #{deploy_to}/shared/pids/resque_production_#{i}.pid ]; then echo \"Killing Worker #1\"; kill -s QUIT `cat #{deploy_to}/shared/pids/resque_production_#{i}.pid`; rm -f #{deploy_to}/shared/pids/resque_production_#{i}.pid; echo \"Done\"; fi;" 
    end 
end 
Смежные вопросы