Обновлено: 23 июня 2026 г. в 11:04

Теорема CAP

средний

Фундаментальное ограничение распределённых систем при сетевых разделениях: как выбирать между консистентностью, доступностью и управляемой деградацией. История, заблуждения, ACID и BASE.

CAP полезна не как школьный треугольник, а как напоминание о неприятной реальности: когда сеть распадается на части, системе приходится выбирать, что защищать в первую очередь.

На практике эта глава помогает уйти от абстрактного спора и честно решить, что будет потеряно первым: часть операций записи, часть чтений, часть пользовательского сценария или предсказуемость эксплуатации.

В интервью и архитектурных разборах она особенно сильна, когда вы обсуждаете не определение теоремы, а последствия для API, пользовательского опыта, деградации сервиса и процедур восстановления.

Практическая польза главы

Практика проектирования

Помогает выбирать поведение CP или AP по доменному сценарию, а не по абстрактной теории.

Качество решений

Даёт критерии, когда допустимы устаревшие ответы, а когда свежесть данных критична для бизнеса.

Аргументация на интервью

Позволяет чётко объяснить, почему выбранный компромисс подходит именно этому профилю нагрузки.

Риски и компромиссы

Делает явными последствия сетевого разделения: деградацию API, эффект на пользовательский опыт и операционные ограничения.

Оригинал

Telegram: Книжный куб

Оригинальный пост с разбором теоремы CAP.

Перейти на сайт

нужна не для того, чтобы навесить на систему ярлык AP или CP. Она задаёт язык, на котором можно обсуждать, что произойдёт с распределённой системой в момент : пока часть кластера не видит другую, между , и приходится выбирать явно.

На практике этот выбор запускают не абстрактные свойства, а , поведение клиентов и цена деградации для бизнеса. Поэтому дальше мы посмотрим на теорему CAP вместе с , и — без этого контекста треугольник теоремы CAP легко превращается в красивую, но бесполезную картинку.

Теореме уже больше 25 лет, а её всё ещё пересказывают как игру «выберите два свойства из трёх». Опираясь на ретроспективу Эрика Брюэра, разберёмся, что именно она утверждает, где её регулярно упрощают и зачем она нужна, когда вы принимаете решение о репликации, кворумах или поведении API во время аварии.

Фундамент

Протокол TCP

Где именно рвётся связь и копятся задержки — то, из чего и складывается «P» в теореме CAP.

Читать обзор

Что утверждает теорема CAP

Классическая формулировка описывает пределы распределённой системы именно в момент сетевого разделения. Это не клеймо на всю архитектуру и не пожизненный выбор «двух свойств из трёх». Это напоминание: пока часть кластера не видит другую, нужно явно решить, чем вы готовы пожертвовать здесь и сейчас.

"The CAP theorem states that any networked shared-data system can have at most two of three desirable properties"
CКонсистентность

Любое чтение видит одно и то же актуальное состояние — как если бы у системы была только одна копия данных.

AДоступность

Каждый запрос к исправному узлу получает ответ. Свежесть данных при этом не гарантируется — важно само наличие ответа.

PУстойчивость к сетевым разделениям

Система продолжает работать, даже если часть узлов временно потеряла связь с другой частью сети — а не падает целиком.

Фундамент

Модель OSI

Помогает разобрать сетевые слои и понять, на каком из них рождается то, что мы потом называем разделением.

Читать обзор

Визуализация теоремы CAP

Интерактивная диаграмма теоремы CAP

Выберите свойство или тип системы, чтобы увидеть, как связаны основные компромиссы.

CAPCPAPCA
Консистентность

Единый линеаризуемый взгляд на данные

Доступность

Ответ на каждый запрос к исправному узлу

Устойчивость к сетевым разделениям

Работа продолжается даже при разрыве связи

Типы систем

Важный нюанс

В реальных распределённых системах устойчивость к сетевым разделениям не выбирают отдельно: она нужна по умолчанию. Поэтому практический вопрос обычно сводится к тому, как система ведёт себя на шкале между CP и AP.

Презентация

PODC 2000

Оригинальная презентация Эрика Брюэра на симпозиуме.

Перейти на сайт

Как появилась теорема

1998

Эрик Брюэр формулирует идею, которая позже получит название теоремы CAP.

1999

Идея появляется в статье "Harvest, Yield, and Scalable Tolerant Systems" и выходит в академическое поле.

2000

Брюэр представляет тезис на Symposium on Principles of Distributed Computing.

2002

Сет Гилберт и Нэнси Линч формально доказывают теорему и уточняют понятие консистентности через линеаризуемость.

Связанная глава

DDIA

Разбирает консистентность и репликацию до уровня инженерных последствий сетевых отказов — туда, где теорема CAP перестаёт быть треугольником.

Читать обзор

Распространённые заблуждения

Популярная формула «выберите два из трёх» удобна для слайда, но плохо описывает реальную систему. Сам Эрик Брюэр в ретроспективе отдельно проговаривает несколько уточнений, без которых теорему легко применить криво.

1

Сетевые разделения редки, но их нельзя игнорировать

В штатном режиме система спокойно держит и консистентность, и доступность. Теорема включается только в момент разрыва — и именно тогда от вас ждут заранее продуманного ответа, а не импровизации в проде.

2

Компромисс выбирается не для всей системы сразу

Решение принимается на уровне операции, маршрута записи или типа данных. Внутри одного сервиса часть данных может жёстко защищать свежесть, а часть — спокойно отвечать с устаревших реплик.

3

Свойства имеют градации

Доступность — не флаг, а доля успешных ответов. У консистентности есть свои уровни, а само разделение бывает разным: где-то это явный обрыв, где-то — настолько медленный канал, что он неотличим от обрыва.

Что делать при сетевом разделении

Пока сеть исправна, система держит и консистентность, и доступность одновременно. Как только связь между частями кластера рвётся, нужен заранее проговорённый сценарий — иначе компромисс выберут случайные клиенты в момент инцидента.

Обнаружить проблему

Поймать сигнал, что связь между частями кластера потеряна или стала слишком нестабильной, чтобы доверять ей кворумные решения.

Ограничить операции

Решить заранее, что отклонить, что упростить и что разрешить в деградированном режиме — не оставляя выбор на интуицию дежурного.

Восстановить состояние

Когда связь возвращается, остаётся самое неприятное: синхронизировать реплики, разобрать конфликты и провести компенсирующие действия по тем операциям, что прошли в режиме деградации.

Связанная глава

Database Internals

Спускается на уровень транзакций, изоляции и механизмов хранения — там видно, во что превращаются теорема CAP и модель ACID на практике.

Читать обзор

Связь с моделью ACID и моделью BASE

Слово «консистентность» в теореме CAP, в и в означает разные вещи, и из-за этого обсуждения регулярно идут по кругу. Сопоставление моделей помогает развести смыслы прежде, чем спорить о компромиссах.

ACID

AAtomicity — атомарность
CConsistency — консистентность
IIsolation — изоляция
DDurability — долговечность данных

В модели ACID консистентность — это про инварианты и бизнес-правила транзакции, а не про свежесть данных между репликами, о которой говорит теорема CAP. Совпадение буквы C здесь скорее мешает, чем помогает.

BASE

BABasic Availability — базовая доступность
SSoft state — мягкое состояние
EEventual consistency — консистентность: согласованность в конечном итоге

Модель BASE — это уже не про транзакции, а про архитектурный стиль: систему сознательно проектируют так, чтобы во время сбоев удержать доступность, мирясь с временным расхождением копий данных.

Почему задержка всё равно важна

В классической формулировке задержка отдельно не названа, но на практике именно она сообщает системе, что сеть ведёт себя как разделённая. Решение почти всегда зашито в жёсткие тайм-ауты: они и определяют, в какой момент медленный канал превращается в «разрыв» с точки зрения теоремы CAP.

Отклонить операцию

Отказаться от части доступности ради того, чтобы не пустить в систему несогласованное состояние.

Продолжить операцию

Ответить клиенту сейчас, заранее согласившись с риском устаревших данных и расхождением реплик, которое придётся чинить потом.

Ключевой инсайт

На уровне кода сетевое разделение почти всегда выглядит как . Поэтому значение тайм-аута — это не настройка производительности, а инженерное решение: чем оно меньше, тем чаще система объявляет «разделение» по медленному, но в целом живому каналу.

Что важно запомнить

  • Сетевое разделение — не глобальный флаг: разные узлы видят ситуацию по-разному, и решение приходится принимать локально.
  • В аварии система выбирает не «два свойства из трёх», а конкретную стратегию деградации для конкретной операции.
  • Жёсткие тайм-ауты повышают чувствительность к медленной сети — система чаще объявляет «разделение», даже когда физического обрыва нет.
  • Теорема CAP полезна там, где её используют для разговора о поведении API, пользовательском опыте и процедурах восстановления, а не как декоративный треугольник на слайде.

Оригинал

Telegram: Книжный куб

Пост с разбором формального доказательства теоремы CAP.

Перейти на сайт

Формальное доказательство

В 2002 году Сет Гилберт и Нэнси Линч опубликовали работу, в которой гипотеза Брюэра превратилась в формальную теорему — со строгими определениями и доказательством.

"It is impossible for a web service to provide the following three guarantees: consistency, availability, partition-tolerance"

Формализация свойств

1. Консистентность

Здесь консистентность определена через : все операции выглядят так, будто выполняются мгновенно и в едином порядке между моментом вызова и моментом ответа.

"Under this consistency guarantee, there must exist a total order on all operations such that each operation looks as if it were completed at a single instant."

Иначе говоря, снаружи система выглядит как один узел, обрабатывающий операции по одной — даже если внутри у неё много реплик и сложная репликация.

2. Доступность

Каждый запрос, попавший на исправный узел, обязан завершиться ответом. Формально определение слабое — верхней границы по времени нет. Но в условиях разделения оно оказывается жёстким: даже при потере сообщений запрос всё равно должен дойти до ответа, а не повиснуть навсегда.

3. Устойчивость к сетевым разделениям

Модель допускает самый неприятный случай: сеть теряет произвольное число сообщений между частями кластера, и доказательство должно работать даже в нём.

"When a network is partitioned, all messages sent from nodes in one component of the partition to nodes in another component are lost."

Доказательство

1Теорема для асинхронных систем

Theorem 1:

It is impossible in the asynchronous network model to implement a read/write data object that guarantees Availability and Atomic consistency in all fair executions (including those in which messages are lost).

Для нельзя одновременно гарантировать доступность и атомарную консистентность во всех корректных исполнениях, если возможна потеря сообщений.

Идея доказательства от противного:

  1. Предположим, что такой алгоритм существует.
  2. Рассмотрим систему из двух узлов: G₁ и G₂.
  3. Представим, что все сообщения между ними теряются.
  4. На G₁ происходит запись.
  5. Позже с G₂ выполняется чтение.
  6. G₂ не сможет вернуть значение, записанное в G₁.
  7. Получаем противоречие: нарушается либо консистентность, либо доступность.

2Теорема для частично синхронных систем

Theorem 2:

It is impossible in the partially synchronous network model to implement a read/write data object that guarantees Availability and Atomic consistency in all executions (even those in which messages are lost).

Реальные системы живут ближе к : у узлов есть часы, тайм-ауты и разумные ожидания по задержкам. Удобно было бы думать, что это спасает, но вывод остаётся тем же: при разделении придётся выбирать между доступностью и атомарной консистентностью.

Примечание: остаток работы посвящён Delayed-t consistency — форме консистентности для частично синхронных систем, которая сознательно ослабляет требования к свежести данных, чтобы вернуть часть доступности.

Связанные главы

Чтобы отмечать прохождение, включи трекинг в Настройки