Что такое CAP теорема
Что проверяют
Понимаете ли вы, что устойчивость к разделению не выбирают, и что теорема описывает поведение системы во время сетевого разрыва, а не общий характер базы данных. Для бэкендера вопрос прикладной: что делает ваш сервис, когда соседний узел или кворум недоступен.
Как отвечать
Формулировка: при разделении сети распределённая система может сохранить либо согласованность в смысле линеаризуемости, либо доступность, но не обе сразу.
Ключевая поправка, которой обычно и ждут: P это не свойство, которое включают галочкой. Сеть рвётся сама, и отказ от устойчивости к разделению означает лишь отказ от распределённости. Значит выбор двоичный и только на время разрыва: система класса CP отвечает ошибкой или ждёт, система класса AP отвечает возможно устаревшими данными.
Пример из повседневного стека: кластер на Raft принимает запись только при наличии большинства, потерялся кворум, и записи прекращаются. Это осознанный выбор CP, и ваш сервис обязан его пережить.
Дальше стоит продолжить до PACELC: даже когда разрыва нет, остаётся выбор между задержкой и согласованностью, и именно он решает, читать с лидера или с ближайшей реплики. В коде это выражается просто: дедлайн на каждый внешний вызов через context.WithTimeout, отдельная ветка на context.DeadlineExceeded и заранее принятое решение, отдавать клиенту ошибку или устаревшее значение из кэша.
Где спотыкаются
Повторяют формулу про выбор двух свойств из трёх. Она ведёт к несуществующему классу CA: система без устойчивости к разделению это один узел, а к нему теорема неприменима.
Клеят ярлык на всю базу целиком. Уровень согласованности во многих хранилищах настраивается на запрос, через кворумы чтения и записи, поэтому одно и то же хранилище бывает и доступным, и согласованным в зависимости от настроек клиента.
Путают согласованность из CAP с буквой C в ACID. В теореме это про наблюдателя, который видит единственную актуальную копию данных, в транзакциях это про сохранение инвариантов схемы. Совпадение букв случайное, и на уточняющем вопросе это видно сразу.