如何防止任务重叠?使用分布式锁(DistributedMutex)?

我是插件新手。我正在尝试适配一个运行时间约为一小时的插件。查看 /sidekiq 页面,我发现该任务每 30 分钟运行一次。因此,在第一个任务完成之前,同一任务的另一个实例就开始运行,导致结果重复。我该如何防止这种情况?

当然,一种选择是让任务在允许的 30 分钟内完成,但还有其他限制条件,我更倾向于让它按所需时间运行。

我尝试了以下方法,但似乎无法阻止第二个任务实例运行:

DistributedMutex.synchronize("custom_digest", validity: 180.minutes)

我认为摘要邮件任务执行了今年早些时候添加的测试。您可以查看一下。

我认为我做的事情与 https://review.discourse.org/t/feature-allow-post-process-mutex-to-be-held-longer/5017https://review.discourse.org/t/fix-post-and-topic-creation-race-condition/5247 相同,只是使用了花括号而不是 do/end,但这应该无关紧要。

DistributedMutex.synchronize(“custom_digest”, validity: 180.minutes) {
do_stuff
}

然而,do_stuff 却在 180 分钟内多次并发执行。

如果互斥锁位于 execute 块内部,那仅仅意味着代码会在此处阻塞并等待互斥锁,也就是说你会看到两个任务在运行:一个实际在执行,另一个则在等待互斥锁。

也许你可以先检查是否有其他实例正在运行,如果有则提前返回?由于对具体使用场景了解甚少,很难给出确切判断。