Il mio suggerimento iniziale sarebbe un mutex per questo lavoro specifico. Ma poiché c'è la possibilità che tu possa avere più server di applicazioni che svolgono i lavori sidekiq, suggerirei qualcosa a livello di redis.
Ad esempio, usa redis-semaphore all'interno della definizione di lavoratore sidekiq. Un esempio non testato :
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