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