Sidekiq / Ruby На рельсах — Блокировка с помощью Redis (Redlock) не правильная блокировка

#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. Очевидно, у меня был еще один фрагмент кода, на который блокировка не повлияла из-за того, что он существовал в немного другой среде.