Mit første forslag ville være en mutex til dette specifikke job. Men da der er en chance for, at du har flere applikationsservere, der arbejder med sidekiq-jobbene, vil jeg foreslå noget på redis-niveau.
Brug f.eks. redis-semaphore inden for din sidekiq-arbejderdefinition. Et uafprøvet eksempel :
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