Теорема 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 подходит для лайков/лент; выбирают по цене ошибки.