2013-07-28 75 views
0

爲什麼我們需要在將代碼部署到服務器時停止resque worker?ruby​​ on rails在部署到服務器時停止resque worker

這是我的部署文件的一部分。我發現有一個可能的錯誤的代碼:

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中運行。無法重新啓動工作人員意味着工作人員正在運行上次啓動的代碼修訂版;如果您對功能進行了大量更改,那麼您可能會運行代碼,這會破壞或引入錯誤,因爲您當前的代碼可能與其運行的代碼版本不兼容。

順便說一句,像下面的表格將有助於防止這樣的錯誤在將來(以及讓你添加更多的工人只是通過增加上限):

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