Mijn eerste suggestie zou een mutex zijn voor deze specifieke taak. Maar aangezien er een kans is dat meerdere applicatieservers de sidekiq-taken uitvoeren, zou ik iets op redis-niveau voorstellen.
Gebruik bijvoorbeeld redis-semafoor binnen uw sidekiq-werknemersdefinitie. Een niet-getest voorbeeld :
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