2014-06-23 43 views
0

我正在將一個應用程序運行到生產服務器,需要使用DelayedJob執行後臺任務。這些任務需要很長時間才能執行。Rails,Capistrano和DelayedJob:使用活動任務進行部署

我deploy.rb有這樣的事情:

desc "Start workers" 
task :start_workers do 
    run "cd #{release_path} && RAILS_ENV=production script/delayed_job -n 2 start" 
end 

desc "Stop workers" 
task :stop_workers do 
    run "cd #{current_path} && RAILS_ENV=production script/delayed_job stop" 
end 

before "deploy", "stop_workers" 
after "deploy:start", "start_workers" 

現在,讓我們假設有一個後臺作業。我需要更新應用程序。運行部署將導致延遲的作業停止並且任務將被中斷。

如何在不停止後臺作業的情況下部署?

回答

0

delayed_job將等待當前工作完成處理(除非您真的強制它停止)。

所以,我想你有幾個選項。在繼續部署之前,您可以等待當前作業完成。我很確定這就是你的代碼目前所做的。

或者,您可以讓delayed_job繼續在後臺處理其當前作業。即告訴delayed_job停止隊列,但不要同時暫停部署。它將繼續使用之前部署的代碼運行。我建議,這樣做風險更大,因爲您的部署過程可能包含數據庫模式更改和遷移,這可能會導致當前正在運行的作業出現問題。

最後,您可以對長時間運行的作業進行編碼,以便它們能夠應對中斷。如果失敗,delayed_job將重新運行該作業。

這聽起來像你想要的第二個選項,但我認爲,除非工作多分鐘運行,我會選擇等待延遲的工作來處理當前的工作。

相關問題