#ruby-on-rails #ruby #redis #sidekiq #redlock
Вопрос:
Я пытаюсь заблокировать часть своего кода с помощью Redis с помощью библиотеки Redlock.
Я реализовал это здесь:
def perform(task_id, task_type)
lock_manager = Redlock::Client.new([ "redis://127.0.0.1:6379" ])
lock_key = "task_runnuer_job_#{task_type}_#{task_id}"
puts("locking! #{task_id}")
lock_task = lock_manager.lock(lock_key , 6 * 60 * 1000)
if lock_task.present?
begin
# Exec task...
Services::ExecTasks::Run.call task.id
ensure
puts("unlocking! #{task_id}")
lock_manager.unlock(lock_task)
end
else
puts("Resource is locked! #{lock_key}")
end
end
Что я получаю при одновременном выполнении нескольких заданий Sidekiq, так это следующие журналы:
"locking! 520"
"locking! 520"
"unlocking! 520"
"unlocking! 520"
Это происходит, когда обе мои задачи 520, которые не должны выполняться вместе, вызываются с разницей в 1 мс.
Тем не менее, иногда замок работает так, как ожидалось.
Я проверил Redis, и он работает просто отлично.
Есть какие-нибудь идеи? Спасибо!
Комментарии:
1. Может быть, у вас разные типы?
2. Очевидно, у меня был еще один фрагмент кода, на который блокировка не повлияла из-за того, что он существовал в немного другой среде.