← Назад к списку
Системный дизайнАрхитектура и алгоритмыJunior

Объясните 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

ИП Кочкин Алексей Сергеевич · ИНН 390509026279 · ОГРНИП 325390000030973 · jiniys2005@yandex.ru