Каков рекомендуемый способ создания распределенной блокировки с помощью Redis в Azure?
Я хочу создать распределенную блокировку в Redis на Azure для нашей рабочей роли с несколькими экземплярами. Мне нужен способ создания "критических разделов", для которых только один поток может иметь доступ одновременно к нескольким экземплярам рабочей роли.
Я использую для этого клиента StackExchange.Redis, и, что полезно, он имеет реализацию транзакционных TakeLock\ReleaseLock
уже, и этот ответ на SO дает мне хорошее представление о шаблоне для использования и подробности о том, как создать блокировку.
Продолжая изучать эту тему, я также прочитал эту статью о Redis, касающуюся distlock, которая описывает слабые стороны узлов Redis на основе аварийного переключения при попытке реализовать механизм распределенной блокировки.
Кэш Azure Redis реализует аварийное переключение между главным и подчиненным (кроме базового уровня), поэтому означает ли это, что мне потребуется реализовать шаблон повторной блокировки, чтобы гарантировать, что только одна вещь когда-либо будет иметь блокировку?
Кроме того, мне интересно:
- Почему в строках подключения примера Redis Azure, по-видимому, не указаны ведущий и ведомый в них? В Azure реализовано переключение между главным и подчиненным устройствами по-другому?
- Почему одна реализация.NET redlock выбрана, чтобы не поддерживать использование master/slave в его использовании? (См. Раздел "Использование", первый абзац). Это просто по выбору или потому, что ведущий / ведомый не является допустимым использованием redlock (в статье о redis это не так)
1 ответ
Я автор библиотеки RedLock.net, которую вы указали в своем вопросе. Причина, по которой в документации указано подключение к независимым экземплярам Redis, основана на причинах, приведенных в документации Redis Distlock. Вынуждая выполнять запись только в главные узлы, мы надеемся избежать ситуации, когда пользователь может неправильно настроить Redlock для подключения к нескольким реплицированным хостам.
Согласно Azure Redis Cache 103 - Аварийное переключение и мониторинг, перед Azure Redis Cache есть балансировщик нагрузки (на стандартном уровне и выше), который обеспечивает постоянное подключение к мастеру.
Подключение к нескольким экземплярам Redis (либо реплицируемым, либо нет) должно дать довольно хорошую гарантию того, что ни один из двух процессов не будет запущен одновременно (больше, чем один реплицируемый экземпляр).
Для того чтобы другой процесс "украл" блокировку до завершения первого, более половины независимых экземпляров redis должны были бы потерять свои ключи блокировки (например, путем перезапуска без сохранения данных), а затем процесс два получил блокировку перед таймером. в процессе один повторно получил его во время его таймера продления.