Moja początkowa sugestia byłaby muteksem dla tej konkretnej pracy. Ale ponieważ istnieje szansa, że możesz mieć wiele serwerów aplikacji obsługujących zadania sidekiq, sugerowałbym coś na poziomie redis.
Na przykład użyj redis-semaphore w Twojej definicji pracownika sidekiq. Nieprzetestowany przykład :
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