Сначала небольшое исправление в терминологии. «Рабочие» - это постоянно запущенные потоки, которые потребляют «задания» из «очередей». Следовательно, вы не обрабатывает worker1, вместо этого worker1 будет обрабатывать задания из очереди 1.
Теперь подходим к решению: -
Похоже, что ваш вариант использования заключается в том, что вы не хотите, чтобы конкретный тип задания (тот, который загружается на s3 в вашем случае) выполнялся более чем на одном работнике в данный момент.
Для этого вам понадобится механизм блокировки на уровне работы. Sidekiq не обеспечивает блокировку самостоятельно, поэтому для этого вам нужно использовать внешние гемы.
Я использовал «sidekiq-lock» на базе Redis для достижения чего-то похожего в моих проектах.
Gem Link
Использование выглядит следующим образом: -
class Worker
include Sidekiq::Worker
include Sidekiq::Lock::Worker
# static lock that expires after one second
sidekiq_options lock: { timeout: 1000, name: 'unique-lock-name' }
def perform
# your code to upload to s3
end
end
Это обеспечит выполнение вашим кодом только одного экземпляра заданий на одном работнике за раз.