Теорема CAP и модели согласованности

В распределённой системе при сбое сети придётся выбрать: отдавать данные или отдавать правду.

Теорема CAP: распределённое хранилище не может одновременно гарантировать согласованность (Consistency), доступность (Availability) и устойчивость к разделению сети (Partition tolerance). При разделении сети приходится выбирать между C и A.

Три буквы CAP

БукваЧто значит
C — Consistencyлюбой узел отдаёт самые свежие данные (или ошибку)
A — Availabilityлюбой живой узел отвечает (пусть и устаревшими данными)
P — Partition toleranceсистема работает, даже если узлы перестали видеть друг друга по сети

Почему выбор всегда между C и A

Сеть в распределённой системе ненадёжна по определению — узлы рано или поздно потеряют связь (partition). Значит, P — не опция, а данность: отказаться от устойчивости к разделению нельзя. Остаётся выбор: когда связь между узлами порвалась и они разошлись, что делать?

  • CP (выбираем согласованность): узел, который не уверен в свежести данных, отвечает ошибкой/ждёт. Данные всегда правдивы, но часть запросов отвергается — доступность страдает.
  • AP (выбираем доступность): узел отвечает тем, что у него есть, пусть и устаревшим. Система всегда отвечает, но данные могут быть несвежими.
Сеть порвалась между узлами A и B.
Клиент пишет в A, потом читает из B.

CP-выбор: B отвечает «не знаю, я отрезан» → ошибка, но без вранья.
AP-выбор: B отдаёт старое значение → ответ есть, но устаревший.

«CA-система» — миф: отказаться от P в распределённой системе нельзя, разделения случаются. CA имеет смысл только для одной машины без сети.

Strong и eventual consistency

СвойствоStrong (строгая)Eventual (итоговая)
После записи читаемсразу свежее значение вездекакое-то время можно старое
Сходимостьмгновеннаячерез короткое время все узлы согласуются
Скорость / доступностьнижевыше
Где уместноденьги, остатки на складелайки, счётчики, лента

Выбор по смыслу данных

Решает не мода, а цена ошибки. Списание денег требует strong consistency — нельзя показать неверный баланс. А число лайков под постом прекрасно живёт с eventual: если оно секунду показывает 1042 вместо 1043, никто не пострадает, зато система быстрая и всегда доступна. Грамотный инженер выбирает модель по каждому типу данных отдельно.

Итог

  • P (устойчивость к разделению) обязательна — реальный выбор всегда между C и A.
  • CP жертвует доступностью ради правды, AP — наоборот; «CA» в распределённой системе невозможна.
  • Strong нужна для денег/остатков, eventual подходит для лайков/лент; выбирают по цене ошибки.
Проверьте себя
1. Что утверждает теорема CAP?
AМожно получить все три свойства сразу
BПри разделении сети нельзя одновременно иметь и согласованность, и доступность — приходится выбирать
CСогласованность всегда важнее доступности
DРаспределённые системы невозможны
2. Почему «CA-система» в распределённом мире — миф?
AПотому что C и A несовместимы вообще
BПотому что от P (устойчивости к разделению сети) нельзя отказаться — сеть ненадёжна
CПотому что таких систем слишком много
DПотому что A не существует
3. Для какого типа данных eventual consistency вполне приемлема?
AБаланс банковского счёта
BЧисло лайков под постом
CОстаток товара при оформлении заказа
DСписание денег
4. Система при разрыве сети отвечает ошибкой, лишь бы не отдать устаревшие данные. Какой это выбор?
AAP — доступность
BCP — согласованность
CCA — обе сразу
Dни один из CAP
Поддержать проект