1

Я ищу создать распределенный Lock внутри Redis на Azure для нашей роли с несколькими экземплярами. Мне нужен способ создания «критических разделов», для которых только один поток может иметь доступ одновременно через несколько экземпляров роли рабочего.Каков рекомендуемый способ создания распределенного Lock с Redis на Azure?

Я использую клиент StackExchange.Redis сделать это и, услужливо, он имеет реализацию транзакционной TakeLock\ReleaseLockalready и this answer на SO дает мне хорошую идею картины использовать и сведения о том, как создать замок ,

Читая дальше по этому вопросу, я также читал эту Redis article regarding distlock, который описывает слабые отказоустойчивых основе Redis узлов при попытке реализовать распределенную механизм блокировки.

Кэш Azure Redis реализует ведущий/ведомый отказоустойчивость (кроме базового уровня), так это значит, что мне нужно будет реализовать redlock шаблон для того, чтобы гарантировать, что только одна вещь когда-либо есть замок?

Кроме того, я задаюсь:

  • Почему Azure Redis строки Пример подключения не, кажется, список ведущего и ведомого в них? Запустили ли Azure переключение режима master/slave по-другому?
  • Почему one .NET implementation из redlock выбрано не для поддержки использования master/slaves в его использовании? (Смотрите раздел Использование, первый пункт) Является ли это по собственному желанию или это потому, что ведущий/ведомый не является допустимым использование redlock (что не казалось бы, дело в redis article)

ответ

2

Я автор библиотеки RedLock.net, которую вы связали в своем вопросе. Причина, по которой документация указывает на подключение к независимым экземплярам redis, основана на рассуждениях в Redis Distlock documentation. Заставляя писать только ведущие узлы, мы надеемся избежать ситуации, когда пользователь может неправильно сконфигурировать Redlock для подключения к нескольким реплицируемым узлам.

В соответствии с Azure Redis Cache 103 - Failover and Monitoring имеется балансировщик нагрузки перед кешем Azure Redis (на уровне стандартного уровня и выше), который гарантирует, что вы всегда подключены к ведущему устройству.

Подключение к нескольким экземплярам redis (либо реплицированным, либо нет) должно дать достаточно хорошую гарантию того, что два процесса не будут работать в одно и то же время (более чем один экземпляр с репликацией).

Для того, чтобы другой процесс «украл» замок до того, как первый закончен, более половины независимых экземпляров redis должны будут потерять свои ключи блокировки (например, перезапустив без сохранения), затем выполните два процесса, чтобы получить перед тем как таймер заработает, он снова закроет его во время его продолжительного таймера.

+0

Я прочитал статью о переделке, а также просмотрел видео. Могу ли я предположить, что если я использую один экземпляр azure, у нас будет такой сценарий: «В этой модели есть очевидное условие гонки: Клиент A получает блокировку в главном. Мастер сработает до того, как будет передана запись в ключ Раб получает повышение до уровня хозяина. Клиент B получает блокировку на тот же ресурс. А уже содержит блокировку. НАРУШЕНИЕ БЕЗОПАСНОСТИ!« –

+0

@AlexMaie: да, я так считаю. Если вам нужна более надежная защита от множества клиентов, входящих в критический раздел, то использование алгоритма блокировки с несколькими независимыми мастерами (или несколькими независимыми реплицируемыми наборами master/slave) должно быть более безопасным. – Sam

Смежные вопросы