Это 13-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления
Распределенная блокировка
В распределенной среде для обеспечения согласованности данных необходимо использовать технологию распределенной блокировки, чтобы гарантировать, что только фиксированное количество процессов одновременно изменяет данные: только клиент, который получает блокировку, может изменять данные. , а другие клиенты могут только изменять данные. Подождите.
Метод реализации:
- уникальный индекс базы данных
- Инструкция SETNX для Redis
- Алгоритм RedLock Redis
- Временные последовательные узлы для ZooKeeper
блокирующий замок
Блокирующие блокировки обычно реализуются с помощью мьютексов:
Мьютекс 0 указывает, что другие процессы используют блокировку, а мьютекс 1 в заблокированном состоянии указывает на разблокированное состояние. 1 и 0 могут быть представлены целочисленным значением или наличием или отсутствием определенных данных.
уникальный индекс базы данных
Вставляет запись в таблицу при получении блокировки и удаляет запись при снятии блокировки. Уникальный индекс может гарантировать, что запись будет вставлена только один раз, поэтому наличие записи можно использовать для определения того, находится ли она в заблокированном состоянии.
Есть следующие проблемы
- Блокировка не имеет срока действия.Если разблокировка не удалась, другие процессы больше не могут получить блокировку;
- Это может быть только неблокирующая блокировка.Если вставка не удалась, об ошибке будет сообщено напрямую, и повторная попытка невозможна;
- Без повторного входа процесс, который уже получил блокировку, также должен повторно получить блокировку.
Инструкция SETNX для Redis
- Используйте команду SETNX (установите, если не существует) для вставки пары ключ-значение.Если ключ уже существует, он вернет False, в противном случае вставка завершится успешно и вернет True.
- Инструкция SETNX аналогична уникальному индексу базы данных, который гарантирует, что существует только одна пара ключ-значение ключа, поэтому, существует ли пара ключ-значение ключа, чтобы судить о том, существует ли она в заблокированном государство.
- Инструкция EXPIRE может установить время истечения срока действия для пары ключ-значение, что позволяет избежать проблемы невозможности снять блокировки при реализации уникальных индексов базы данных.
Алгоритм RedLock Redis
- Несколько экземпляров Redis используются для реализации распределенных блокировок, что гарантирует их доступность в случае единственной точки отказа.Попробуйте получить блокировки от N взаимно независимых экземпляров Redis;
- Вычислить время, затраченное на получение блокировки, только если это время меньше времени истечения срока действия блокировки и блокировка получена из большинства (N/2+1) экземпляров, получение блокировки считается успешным.
- Если получить блокировку не удается, снимите блокировку на каждом экземпляре.
Временные последовательные узлы для ZooKeeper
Для получения дополнительной информации, пожалуйста, обратитесь к этому моему блогу -Как реализовать распределенные блокировки с помощью ZooKeeper?