有沒有辦法告訴所有員工停止處理特定隊列(或所有隊列)的任何新作業?如何暫時停止Resque Queues處理新作業?
我們偶爾會遇到需要的系統不可用(掉電,硬件故障等)的問題,並且關閉這些隊列中的作業處理直到系統恢復聯機狀態將會很有幫助。
而不是確定所有子系統處於好/壞狀態的每個作業,有一些信號指示隊列進入休眠狀態,然後在子系統再次準備好時使它們恢復活動將會有幫助。
沉重的手段是外部關閉所有工人。
有沒有辦法告訴所有員工停止處理特定隊列(或所有隊列)的任何新作業?如何暫時停止Resque Queues處理新作業?
我們偶爾會遇到需要的系統不可用(掉電,硬件故障等)的問題,並且關閉這些隊列中的作業處理直到系統恢復聯機狀態將會很有幫助。
而不是確定所有子系統處於好/壞狀態的每個作業,有一些信號指示隊列進入休眠狀態,然後在子系統再次準備好時使它們恢復活動將會有幫助。
沉重的手段是外部關閉所有工人。
該文檔提到您可以使用這些信號來啓動/繼續重新執行作業。
信號
Resque工人響應了幾個不同的信號:
...
USR2 - 不開始處理任何新的就業機會
CONT - 開始到在USR2後再次處理新作業
來自:https://github.com/resque/resque/tree/cf0897709e857bd557dc7e407e282dc0f2b461df#signals
This gist,顯示瞭如何恢復猴子以停止接受新的工作。
暫停恢復後,它可能仍在處理一些作業。下面是等待10分鐘,所有的作業完成,10分鐘後,如果仍然有運行它們喪命的工作rake任務:
stop_at = Time.now
until Resque.working.empty?
Rails.logger.info "Waiting for #{Resque.info[:working].length} jobs to finish"
sleep(30.seconds)
if stop_at < 10.minutes.ago
Rails.logger.info 'Killing all jobs that didnt finish in 10 minutes...'
Resque.working.map(&:unregister_worker)
end
end
謝謝,我將不得不考慮這一點。雖然從自動化的角度來看它很尷尬。即接觸每個機器併爲每個過程發出殺死信號。 – crispy