首页 > 解决方案 > Sidekiq-Unique-jobs Lock 仅适用于第一个 Worker,然后所有待处理的作业同时执行?

问题描述

我可以在队列中等待 3 个作业,一旦第一个作业完成,所有剩余的工作人员都会同时执行。这是为什么?我希望每个工人都得到一个锁并让其他工作等待,以序列化的方式。

class StuffWorker
  include Sidekiq::Worker
  sidekiq_options lock: :until_executed,
                  lock_timeout: 999,
                  lock_info: true,
                  lock_args_method: :lock_args

  def self.lock_args(args)
    [args[0], args[1]]
  end

  def perform(company_id, person_id)
    sleep 10
    logger.info "STARTING IT! at #{DateTime.now.strftime('%H:%M:%S')}"
  end
end

产生以下内容:

JID-ce8c692b5341adb7a24584ab INFO: STARTING IT! at 23:29:52
JID-ce8c692b5341adb7a24584ab INFO: done: 10.728 sec
JID-ca8dac1cbd7cbaf5d87f6096 INFO: STARTING IT! at 23:30:02
JID-463bfe792775e1412d3c0af7 INFO: STARTING IT! at 23:30:02
JID-463bfe792775e1412d3c0af7 INFO: done: 17.754 sec
JID-ca8dac1cbd7cbaf5d87f6096 INFO: done: 14.024 sec

标签: ruby-on-railsrubysidekiq

解决方案


可能,您想要的只是运行时锁,而不是队列锁。您必须使用while_executing锁类型https://github.com/mhenrixon/sidekiq-unique-jobs#while-executing


推荐阅读