Теорема 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 по частям системы, а не ко всей сразу.
Проверьте себя
1. Между чем реально приходится выбирать по теореме CAP в распределённой системе?
AМежду скоростью и памятью
BМежду согласованностью и доступностью в момент сетевого разделения
CМежду SQL и NoSQL
DМежду кэшем и БД
2. Какой выбор уместен для списания денег с баланса?
AAP с итоговой согласованностью
BCP с сильной согласованностью
CПолный отказ от согласованности
DЛюбой, разницы нет
3. Что такое итоговая (eventual) согласованность?
AДанные никогда не согласуются
BДанные сходятся через некоторое время, кратко возможна рассинхронизация
CВсе чтения всегда видят свежие данные мгновенно
DСогласованность только на одном узле