Mitt första förslag skulle vara en mutex för detta specifika jobb. Men eftersom det finns en chans att du kan ha flera applikationsservrar som arbetar med sidekiq-jobben, skulle jag föreslå något på redis-nivå.
Använd till exempel redis-semaphore inom din sidekiq-arbetardefinition. Ett oprövat exempel :
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