簡體   English   中英

如何確保同一工作不會同時運行兩次?

[英]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 API

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM