#ruby-on-rails #ruby #sidekiq
#ruby-on-rails #ruby #sidekiq
Вопрос:
У меня может быть 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
Комментарии:
1. Разделяют ли эти задачи одинаковые
company_id
иperson_id
? Не могли бы вы распечатать его?2. Да; все они имеют один и тот же идентификатор компании и идентификатор человека; сам работник собирает данные; таким образом, условие гонки возникает, когда больше работников ставятся в очередь и выполняются одновременно
Ответ №1:
Возможно, вам нужна только блокировка во время выполнения, а не блокировка очереди. Вы должны использовать while_executing
тип блокировки https://github.com/mhenrixon/sidekiq-unique-jobs#while-executing .