Что обязательно при реализации распределённой блокировки на Redis?
- Как сделать распределённую блокировку на Redis?
- Что такое Redlock?
SET lock:x <уникальный токен> NX PX 30000 — захват с TTL (чтобы упавший клиент не держал вечно); снятие — Lua-скриптом только своего токена.
- Без уникального токена можно снять чужую блокировку после истечения своей
- Пауза GC дольше TTL — два владельца одновременно
- Для корректности — fencing token, проверяемый хранилищем
А ещё Для эффективности (не делать работу дважды) Redis-блокировки достаточно; для корректности — консенсус
Подробно
Захват делают атомарно — установкой ключа с условием отсутствия и сроком жизни; освобождение обязано проверять владельца, что требует скрипта, иначе между проверкой и удалением вклинится чужой захват. Самое важное — честно понимать границы гарантии: если владелец задержался на паузе сборщика мусора дольше TTL, блокировка истечёт, её возьмёт другой, и оба будут считать себя владельцами. Поэтому такой механизм годится для оптимизации (не выполнять работу дважды), но не для случаев, где двойное выполнение недопустимо — там нужна защита на стороне самого ресурса: условная запись по версии, ограничение уникальности или монотонно растущий маркер, который ресурс проверяет.
Что хотят услышать
- SET NX с TTL и уникальным токеном.
- Атомарное снятие своей блокировки.
- Почему взаимное исключение не абсолютно, fencing.
Частые ошибки
- Считать распределённую блокировку гарантией строгого взаимного исключения.
- Удалять ключ блокировки без проверки владельца.
Проверьте себя
Несколько верных вариантов. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Достаточно одной команды SET с ключом ресурса — TTL и токен лишь усложняют снятие блокировки
- ✓У блокировки должен быть TTL, иначе падение владельца заблокирует ресурс навсегда
- ✓Снимать блокировку можно только своим уникальным токеном
- ✓При паузе владельца дольше TTL владельцев станет двое — нужна защита на стороне ресурса
Что спросят дальше
- Что такое fencing token и зачем он нужен?
- Чем условная запись по версии надёжнее внешней блокировки?
Разбор темы
- Redis и кэширование
Cache-aside и стратегии записи, TTL и eviction, защита от stampede и аккуратные распределённые блокировки.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.