Что такое CAP теорема
Что проверяют
Понимаете ли вы, что CAP это не «выбери два из трёх», а выбор поведения системы в момент сетевого разделения. Java-разработчику следом задают практический вопрос: как ведут себя ваши Kafka, PostgreSQL с репликой или MongoDB, когда связь между узлами рвётся, и что в этот момент видит сервис.
Как отвечать
Сформулируйте теорему точно. Её выдвинул Эрик Брюер в 2000 году, доказали Гилберт и Линч в 2002. При разделении сети (Partition) распределённая система не может одновременно гарантировать:
- Consistency: здесь это линеаризуемость, каждое чтение видит последнюю подтверждённую запись, как если бы копия данных была одна. Это не буква C из ACID;
- Availability: каждый запрос к живому узлу получает ответ без ошибки, пусть и не самый свежий.
Partition tolerance не выбирается: сеть рвётся всегда, поэтому реальный выбор между CP и AP. CP-система при разделении отказывает части запросов (ZooKeeper, etcd, HBase), AP-система отвечает, но может отдать устаревшие данные (Cassandra и DynamoDB в типичных настройках).
Сильный ответ добавляет две вещи. Первая: многие хранилища настраиваются под операцию. В Cassandra уровень согласованности задаётся на запрос (QUORUM, ONE), в MongoDB через writeConcern и readConcern, в Kafka через acks=all вместе с min.insync.replicas. Вторая: теорема PACELC, по которой и без разделения система выбирает между задержкой и согласованностью.
Для Java-сервиса отсюда следуют прикладные решения: идемпотентные ретраи, оптимистичные блокировки через @Version в JPA, паттерн outbox вместо распределённой транзакции между базой и брокером, готовность к eventual consistency в read-моделях.
Где спотыкаются
Называют «CA-систему», например одиночный PostgreSQL. Одна нода вообще не распределённая система, к ней CAP неприменима, а кластер с репликами всё равно выбирает поведение при разрыве.
Путают C из CAP с C из ACID. В ACID это соблюдение ограничений целостности, в CAP это одинаковая картина данных на всех репликах.
Навешивают на базу ярлык раз и навсегда: «MongoDB это CP». Поведение зависит от настроек записи и чтения, и честный ответ звучит как «в такой конфигурации ведёт себя так».