Distributed locks на собеседовании системного аналитика

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Карьерник — Duolingo для аналитиков: 10 минут в день тренируй SQL, Python, A/B, статистику, метрики и ещё 3 темы собеса. 1500+ вопросов в Telegram-боте. Бесплатно.

Зачем distributed lock

Multiple processes / services — coordinate access shared resource.

Examples:

  • Cron job — only one instance runs.
  • Inventory update — prevent oversell.
  • Idempotent operation — first wins.

DB lock не достаточно если operation cross-DB.

Redis-based

Простейший:

SET resource_lock my_token NX EX 30

NX — only if not exists. EX 30 — TTL 30 sec.

Release. Compare token, delete:

if redis.call("get", KEYS[1]) == ARGV[1] then
    return redis.call("del", KEYS[1])
end

Lua script — atomic check-and-delete.

Caveat. TTL — protection если client crashes. Но если operation runs > TTL — другой client gets lock.

Redlock controversy

Antirez's Redlock — multiple Redis instances. Acquire majority for lock.

Martin Kleppmann critique. Doesn't satisfy strong properties under network partition / clock skew. Может give two clients lock.

Practically. Most apps OK с simple Redis lock + idempotency. Strict consistency — use Zookeeper/etcd.

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

ZooKeeper / etcd

Built для distributed coordination.

Approach.

  • Create ephemeral znode (deletes on session end).
  • First creator owns lock.
  • Others watch и wait.

Pros: strong consistency, automatic release on crash.

Cons: slower, complex setup.

Leases vs locks

Lock. Hold until release.

Lease. Hold для bounded time.

Lease + fencing token. Each lease имеет monotonic ID. Resource checks fencing — accepts only highest seen.

Client A: lease token 5 — writes "x".
Client A pause (long GC) — lease expires.
Client B: lease token 6 — writes "y".
Client A resumes — writes "x" с token 5.
Resource: rejects (5 < 6 seen).

Защищает от GC pauses, network delays.

Связанные темы

FAQ

Это официальная информация?

Нет. Статья основана на работах Antirez (Redlock), Martin Kleppmann critique, ZK / etcd docs.


Тренируйте системный анализ — откройте тренажёр с 1500+ вопросами для собесов.