Как сделать распределённую блокировку безопасной
Процесс может зависнуть дольше срока блокировки, проснуться после передачи права другому узлу и затереть его запись. Сервис блокировок от этого не спасает.
В обстоятельном разборе распределённых блокировок Мартин Клеппманн разделяет две задачи:
— для экономии допустим редкий повтор работы;
— для корректности два владельца означают потерю данных или расхождение состояния.
Во втором случае нужен защитный порядковый номер. Сервис выдаёт при каждом захвате всё большее число, а хранилище отклоняет запоздалую запись с меньшим. Redlock такого числа не создаёт: пять серверов Redis и решение большинством не закрывают гонку.
Разбор пригодится тем, кто полагается на блокировку ради корректности. Проверьте, умеет ли хранилище отвергать устаревшие операции: проверки срока перед записью недостаточно, ведь процесс может остановиться после неё.
Post #3011
320