![](/img/trans.png)
[英]How can I make sure that the same delayed job does not twice at the same time (mutually exclusive)
[英]How to assure the same job doesn't run twice at the same time?
我有一個簡單的sidekiq工作,我設置使用發條每5分鍾運行一次。 我擔心的是,如果工作時間超過5分鍾,它將再次運行,如果它與原始作業同時運行,可能會導致一些問題。
有沒有辦法鎖定發條,以便它只在前一次運行完成后運行?
我使用了Sidekiq Unique Jobs gem來實現這一目標。 它有各種防止重復工作的策略。
一種選擇是在作業啟動時創建具有過程PID的文件,並在作業結束時將其刪除,如果PID文件已存在則在開始時中止作業。
雖然我的應用程序的這個特定部分沒有使用sidekiq,但這個想法是一樣的。 以下是我的應用程序的用法: https : //github.com/WikiEducationFoundation/WikiEduDashboard/blob/master/lib/data_cycle/constant_update.rb
Sidekiq允許您通過API查詢隊列。
您可以在任務運行時查詢sidekiq隊列。 檢查隊列和/或作業是否仍然存在。 如果是的話,什么都不做。 如果不是,請將作業排入隊列。
我不知道你的工作是否位於一個單獨的隊列中,這可能是最好的。 這樣您就可以查看隊列大小,如果它是0,則啟動另一個進程。
Sidekiq Enterprise包括對獨特工作的支持。 使用worker類中的選項定義唯一作業:
# app/workers/my_worker.rb
class MyWorker
include Sidekiq::Worker
sidekiq_options unique_for: 10.minutes
def perform(...)
end
end
它們必須在Sidekiq初始化器中啟用:
# config/initializers/sidekiq.rb
Sidekiq::Enterprise.unique! unless Rails.env.test?
時間窗口僅在作業運行時適用,例如,如果它在10分鍾內是唯一的,並且作業在6分鍾內完成,那么Sidekiq將立即允許其他作業入隊; 您不必再等待4分鍾就可以刪除唯一性鎖定。
所有Sidekiq Enterprise節點都實施唯一性約束。
您可能需要調整retries
選項,因為失敗的作業將繼續保持鎖定,只要它處於重試狀態。 (即使它沒有積極執行)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.