Mein erster Vorschlag wäre ein Mutex für diesen speziellen Job. Aber da die Möglichkeit besteht, dass Sie mehrere Anwendungsserver haben, die die Sidekiq-Jobs bearbeiten, würde ich etwas auf Redis-Ebene vorschlagen.
Verwenden Sie beispielsweise redis-semaphore innerhalb Ihrer Sidekiq-Worker-Definition. Ein ungetestetes Beispiel :
def perform
s = Redis::Semaphore.new(:map_reduce_semaphore, connection: "localhost")
# verify that this sidekiq worker is the first to reach this semaphore.
unless s.locked?
# auto-unlocks in 90 seconds. set to what is reasonable for your worker.
s.lock(90)
your_map_reduce()
s.unlock
end
end
def your_map_reduce
# ...
end