如何确保同一作业不会同时运行两次?

Cis*_*tin 5 ruby ruby-on-rails sidekiq clockwork

我有一个简单的 sidekiq 作业,我已将其设置为使用时钟每 5 分钟运行一次。我担心的是,如果作业花费的时间超过 5 分钟,它会再次运行,如果它与原始作业同时运行,这可能会导致一些问题。

有没有办法锁定发条,使其仅在前一次运行完成后才运行?

Sag*_*oss -1

一种选择是在作业开始时创建一个包含进程 PID 的文件,并在作业结束时将其删除,如果 PID 文件已存在,则在开始时中止作业。

尽管我的应用程序的这个特定部分没有使用 sidekiq,但其想法是相同的。我的应用程序是这样做的:https://github.com/WikiEducationFoundation/WikiEduDashboard/blob/master/lib/data_cycle/constant_update.rb

  • 这并不能保证作业是唯一的,因为 Sidekiq 可以在多个节点上同时运行,因此作业可能会也可能不会触发,具体取决于运行该作业的节点。由于Sidekiq需要Redis,所以更好的解决方案是使用Redis作为数据存储。一个例子是 https://github.com/kenn/redis-mutex。 (4认同)