Обновлено: 30 апреля 2026 г. в 22:03

CAP теорема

средний

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

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

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

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

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

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

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

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

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

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

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

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

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

Оригинал

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

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

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

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

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

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

Фундамент

Протокол TCP

Сетевые разделения и задержки напрямую влияют на поведение системы в терминах 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

Даёт глубокий контекст по транзакциям, изоляции и механизмам хранения.

Читать обзор

Связь с ACID и BASE

Теорему CAP часто путают с и . Это полезное сопоставление, но они отвечают на разные вопросы.

ACID

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

В ACID консистентность — это соблюдение бизнес-правил и инвариантов транзакции, а не тот смысл консистентности, о котором говорит CAP.

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 в частично синхронных системах — компромиссный подход, который ослабляет требования к свежести данных.

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

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