00 Mental model: how to reason about failure modesМентальная модель: как рассуждать о режимах сбоев
The single thread that runs through every distributed-systems answer. Lead with this framing.
Единая нить, проходящая через каждый ответ о распределённых системах. Начинай с этого фрейминга.
Distributed systems is the study of what happens when independent failure meets unbounded message delay. A senior answer always names: (1) what can fail, (2) how you detect it, (3) how the system behaves during the failure, (4) how it recovers, and (5) what guarantee survives the whole thing.
Распределённые системы — это изучение того, что происходит, когда независимый сбой встречается с неограниченной задержкой сообщений. Ответ senior-уровня всегда называет: (1) что может упасть, (2) как ты это обнаруживаешь, (3) как система ведёт себя во время сбоя, (4) как она восстанавливается, и (5) какая гарантия переживает всё это.
The reasoning checklist (say it out loud)
Чек-лист рассуждений (произноси вслух)
- Enumerate failure domains: node crash, slow node (gray failure), disk full, network partition, clock skew, dependency down, poison message, traffic spike.
- Pick the model: crash-stop vs crash-recovery vs Byzantine; synchronous vs partially-synchronous network (real world = partially synchronous).
- Detection: timeouts and heartbeats are suspicion, not truth. You can never distinguish "dead" from "slow" — this is the FLP impossibility in practice.
- Blast radius: does one failure cascade? Bulkheads, timeouts, circuit breakers, backpressure.
- Recovery + guarantee: idempotency, retries with jitter, replay from durable log, checkpoint/offset rewind.
- Перечисли домены сбоев: падение ноды, медленная нода (gray failure), диск полон, разделение сети, перекос часов, зависимость упала, poison-сообщение, всплеск трафика.
- Выбери модель: crash-stop vs crash-recovery vs Byzantine; синхронная vs частично синхронная сеть (реальный мир = частично синхронная).
- Обнаружение: таймауты и heartbeat — это подозрение, не истина. Ты никогда не различишь «мёртвый» от «медленный» — это FLP impossibility на практике.
- Радиус поражения: один сбой каскадирует? Bulkheads, таймауты, circuit breakers, backpressure.
- Восстановление + гарантия: идемпотентность, ретраи с jitter, переигрывание из надёжного лога, откат checkpoint/offset.
01 CAP theorem & PACELCТеорема CAP и PACELC
The most-asked opener. Be precise: CAP is about behavior during a partition, not a permanent property.
Самый частый вопрос на открытие. Будь точен: CAP — про поведение во время разделения, а не постоянное свойство.
CAP, stated correctly
CAP, сформулированная правильно
During a network Partition, a distributed store can preserve at most one of Consistency (linearizable reads) or Availability (every non-failing node answers). When there is no partition, you get both — CAP says nothing about the happy path.
Во время разделения сети (Partition) распределённое хранилище может сохранить максимум одно из Consistency (линеаризуемое чтение) или Availability (каждая не-упавшая нода отвечает). Когда разделения нет, получаешь оба — CAP ничего не говорит про happy path.
- CP — refuse/block on the minority side to stay consistent. (ZooKeeper, etcd, HBase, Spanner-as-CP.)
- AP — keep answering, reconcile later, tolerate stale/conflicting reads. (Dynamo, Cassandra default, Riak.)
- "CA" is not a real operating point for a networked system — partitions will happen, so you only choose C-vs-A for the partition.
- CP — отказывать/блокироваться на стороне меньшинства, чтобы сохранить консистентность. (ZooKeeper, etcd, HBase, Spanner-как-CP.)
- AP — продолжать отвечать, согласовывать потом, терпеть устаревшие/конфликтующие чтения. (Dynamo, Cassandra по умолчанию, Riak.)
- «CA» — не реальная точка работы для сетевой системы — разделения будут происходить, поэтому выбираешь только C-против-A для разделения.
PACELC — the more useful version
PACELC — более полезная версия
CAP ignores the cost you pay when the system is healthy. PACELC fixes that:
CAP игнорирует цену, которую ты платишь, когда система здорова. PACELC это исправляет:
| System | On partition (PA/PC) | Else, normal (EL/EC) | Class |
|---|---|---|---|
| Dynamo / Cassandra | PA (stay up) | EL (fast, eventual) | PA/EL |
| Spanner | PC (consistent) | EC (TrueTime waits) | PC/EC |
| etcd / ZooKeeper | PC | EC | PC/EC |
| MongoDB (default) | PC | EC (primary reads) | PC/EC |
| Cassandra (tuned QUORUM) | PC-ish | EC-ish | tunable |
| Система | При разделении (PA/PC) | Иначе, норма (EL/EC) | Класс |
|---|---|---|---|
| Dynamo / Cassandra | PA (остаться в сети) | EL (быстро, eventual) | PA/EL |
| Spanner | PC (консистентно) | EC (TrueTime ждёт) | PC/EC |
| etcd / ZooKeeper | PC | EC | PC/EC |
| MongoDB (default) | PC | EC (чтение с primary) | PC/EC |
| Cassandra (tuned QUORUM) | PC-ish | EC-ish | настраиваема |
02 Consistency modelsМодели консистентности
A spectrum from "always correct, slow" to "fast, surprising". Know where each sits and the client guarantees.
Спектр от «всегда корректно, медленно» до «быстро, сюрпризы». Знай, где находится каждая и какие гарантии клиенту.
| Model | Guarantee | Cost | Use it for |
|---|---|---|---|
| Linearizable / Strong | Every read returns the latest committed write as of a real-time point; behaves like one copy. | Quorum / consensus round-trips; latency + availability hit. | Locks, leader election, counters, balances, config. |
| Sequential | All nodes see ops in same order, but not necessarily real-time order. | Cheaper than linearizable. | Replicated state machines. |
| Causal | Operations that are causally related are seen in order by everyone; concurrent ops can differ. | Track causality (version vectors); cheap, available. | Collaborative apps, comments/replies, messaging. |
| Read-your-writes (session) | A client always sees its own prior writes. | Sticky routing or version tokens. | "I posted but don't see it" UX bugs. |
| Monotonic reads | Time never goes backwards for a client. | Pin to a replica / hold a token. | Avoid "now you see it, now you don't". |
| Eventual | If writes stop, all replicas converge. | Cheapest, most available. | Caches, analytics, feeds, metrics. |
| Модель | Гарантия | Цена | Применяй для |
|---|---|---|---|
| Linearizable / Strong | Каждое чтение возвращает последнюю закоммиченную запись на момент real-time; ведёт себя как одна копия. | Кворум / консенсус round-trips; удар по задержке + доступности. | Блокировки, выбор лидера, счётчики, балансы, конфиги. |
| Sequential | Все ноды видят операции в одинаковом порядке, но не обязательно real-time. | Дешевле linearizable. | Реплицированные state machines. |
| Causal | Причинно связанные операции видны всеми в порядке; конкурентные операции могут отличаться. | Отслеживание причинности (version vectors); дёшево, доступно. | Коллаборативные приложения, комментарии/ответы, мессенджинг. |
| Read-your-writes (сессия) | Клиент всегда видит свои предыдущие записи. | Sticky routing или version tokens. | Баги UX «я запостил, но не вижу». |
| Monotonic reads | Время никогда не идёт назад для клиента. | Привязка к реплике / держать токен. | Избегать «то вижу, то не вижу». |
| Eventual | Если записи остановятся, все реплики сойдутся. | Дешевле всего, максимально доступно. | Кеши, аналитика, ленты, метрики. |