CAP theorem

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

Она говорит: при сетевом разделении система не может одновременно гарантировать все три свойства:

C — Consistency / согласованность
Все узлы видят одни и те же актуальные данные.
Например: если ты записал balance = 100, то любой последующий запрос к любому узлу должен увидеть именно 100, а не старое значение.

A — Availability / доступность
Каждый запрос получает ответ, даже если часть системы сломалась или недоступна.
Не обязательно «правильный самый свежий» ответ, но система не падает и не говорит: «не могу обслужить».

P — Partition tolerance / устойчивость к разделению сети
Система продолжает работать, даже если между узлами пропала связь.
Например, дата-центр А не видит дата-центр Б, но оба ещё живы.

Главная суть не в том, что «можно выбрать только два из трёх» вообще. Это популярное, но немного туповатое упрощение.

Более точная формула такая:

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

То есть P в реальном распределённом мире почти не выбирается. Сеть может ломаться. Пакеты могут теряться. Узлы могут временно не видеть друг друга. Поэтому вопрос обычно такой:

Когда случился partition, что важнее: не отвечать, чтобы не соврать, или отвечать, рискуя временной рассинхронизацией?

Выбирает Consistency + Partition tolerance.

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

Пример логики:

Лучше временно не принять запись, чем принять две конфликтующие версии истины.

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

AP-система

Выбирает Availability + Partition tolerance.

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

Пример логики:

Лучше ответить сейчас, даже если данные временно не идеально свежие.

Это подходит для лайков, просмотров, кэшей, фидов, некоторых пользовательских действий, где временная рассинхронизация допустима.

Простой пример

Есть два сервера:

  • сервер A в Москве;
  • сервер B в Берлине.

Пользователь записал новое значение на сервер A.
Но между A и B пропала сеть.

Теперь другой пользователь обращается к серверу B.

Варианты:

CP-поведение:
B говорит: «Я не уверен, что у меня свежие данные, поэтому не отвечу / откажу в операции».
Согласованность сохранена, доступность потеряна.

AP-поведение:
B отвечает тем, что у него есть.
Доступность сохранена, но данные могут быть устаревшими.

Главное различение

CAP — это не про «какая база лучше».
Это про онтологический выбор системы в момент разрыва связи:

  • или система защищает единую истину;
  • или система защищает непрерывность ответа.

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


Нужно разделять стандартый и имплементацию

Прокрутить вверх