Теорема CAP и уровни согласованности
Фундаментальный компромисс распределённых систем, который интервьюер любит проверять.
Теорема CAP — при сетевом разделении (Partition) распределённая система может сохранить либо согласованность (Consistency), либо доступность (Availability), но не оба свойства одновременно.
Три буквы
| Буква | Значение |
| C — Consistency | Все узлы видят одни и те же свежие данные |
| A — Availability | Каждый запрос получает ответ (пусть не свежайший) |
| P — Partition tolerance | Система работает при разрыве сети между узлами |
В реальной распределённой системе сетевые разрывы неизбежны, поэтому P держать обязаны. Значит, выбор реально стоит между C и A в момент разделения.
CP против AP
CP-система при разрыве сети предпочтёт отказать в ответе, лишь бы не отдать устаревшие данные — так делают банковские балансы. AP-система ответит всегда, пусть и слегка устаревшими данными — так работают ленты и счётчики лайков. Правильный выбор зависит от цены неверного ответа.
Сильная и итоговая согласованность
Сильная согласованность: после записи любой следующий чтения видит её немедленно. Итоговая (eventual): данные «сойдутся» через какое-то время, но кратко возможна рассинхронизация. Большинство интернет-систем выбирают итоговую согласованность ради доступности и масштаба.
Как работает под капотом
На собеседовании CAP применяют не как формулу, а как язык компромиссов. Скажите: «Лайки можно делать AP с итоговой согласованностью — ничего страшного, если счётчик секунду расходится. А списание с баланса — строго CP, лучше отказать, чем дважды списать». Привязка CAP к конкретным частям системы — сильный сигнал.
Частые ошибки
- Считать, что можно одновременно получить C, A и P при разделении.
- Выбирать сильную согласованность везде, убивая доступность и масштаб.
- Произносить «CAP» как мантру, не привязывая к данным системы.
Итог
- При разделении выбираем между согласованностью и доступностью.
- CP — для денег и критичных данных; AP — для лент и счётчиков.
- Применяйте CAP по частям системы, а не ко всей сразу.