Объясните CAP-теорему. Что реально выбирают распределённые базы данных и почему «выбери два из трёх» — упрощение?
Короткий ответ
- C — линеаризуемость: чтение видит последнюю запись
- A — каждый живой узел отвечает на запросы
- P — система переживает разрыв сети между узлами
- Разрывы сети неизбежны, поэтому P не опция, а данность
- Реальный выбор при разрыве: консистентность или доступность
- CP: отказать в записи, пока нет кворума; AP: отвечать, потом сверять
- Вне разрыва действует компромисс задержка/консистентность (PACELC)
CAP говорит, что при сетевом разрыве приходится выбирать между консистентностью и доступностью, а P — обязательное свойство любой распределённой системы.
Как сказать вслух
пример ответаЯ бы сразу уточнил, что выбор не «два из трёх»: от разрывов сети никуда не деться, поэтому P обязателен. Реальный вопрос — что делает система во время разрыва: отказывает в операциях ради консистентности или отвечает, рискуя отдать устаревшие данные. И добавлю, что в нормальном режиме компромисс другой — между задержкой и консистентностью.
Подробный ответ
Основной ответ
CAP-теорема: распределённая система при сетевом разрыве (partition) не может одновременно гарантировать консистентность (C, линеаризуемость — любое чтение видит результат последней записи) и доступность (A — каждый запрос к живому узлу получает ответ). Поскольку сеть ненадёжна, устойчивость к разрывам (P) — не выбор, а требование; значит, проектировщик выбирает поведение во время разрыва. CP-системы (ZooKeeper, etcd, HBase) отказывают в операциях без кворума. AP-системы (Cassandra, DynamoDB в режиме eventual) продолжают отвечать и сводят реплики позже. Расширение PACELC добавляет: даже без разрыва есть выбор между низкой задержкой и строгой консистентностью, потому что синхронная репликация стоит времени.
Ключевые моменты
- C — это линеаризуемость. В CAP консистентность — строгое свойство «читаю последнюю запись», а не ACID-консистентность транзакций; их часто путают.
- P не выбирают. Сетевые разрывы, GC-паузы и падения узлов случаются всегда; система без P — это одна машина.
- Выбор не бинарный. Cassandra настраивается уровнями кворума на запрос: ONE — ближе к AP, QUORUM/ALL — ближе к CP; выбор делается на операцию, а не раз навсегда.
- PACELC. При разрыве — A или C; иначе (else) — задержка (L) или консистентность (C): синхронное подтверждение реплик увеличивает латентность.
Практический контекст
Интервьюер проверяет глубину: отличит ли кандидат линеаризуемость от ACID, понимает ли, что P обязателен, может ли привести примеры CP- и AP-систем. Хороший ответ привязывает теорию к практике: для баланса счёта нужен CP-подход, для ленты лайков достаточно AP. Уточняющий вопрос от вас: какие операции в обсуждаемой системе терпят устаревшие данные, а какие нет.
Частые ошибки
- Говорят «MongoDB — это CP, Cassandra — AP» как ярлык, не упоминая настраиваемые уровни согласованности
- Трактуют выбор как «можно отказаться от P» и предлагают CA-систему в распределённой среде
- Путают C из CAP с C из ACID