CAP-теорема
CAP-теорема утверждает: распределённая система не может одновременно гарантировать все три свойства. Нужно выбрать два из трёх.
- C — Consistency (Согласованность): все узлы видят одни и те же данные в один момент времени. Если записали на один узел — читая с любого другого, сразу получишь актуальное значение.
- A — Availability (Доступность): система всегда отвечает на запросы (пусть и не самыми свежими данными), не зависает.
- P — Partition Tolerance (Устойчивость к разделению): система продолжает работать, даже если связь между узлами нарушена (сетевой сбой, узел упал).
В реальности P — не выбор, а необходимость. Сетевые разделения случаются всегда. Поэтому реальный выбор: CP или AP.
| CP | AP | |
|---|---|---|
| При сбое сети | Откажет отвечать (чтобы не дать устаревшие данные) | Ответит устаревшими данными |
| Пример | PostgreSQL, HBase, ZooKeeper | Cassandra, DynamoDB, CouchDB |
| Подходит для | Финансы, бронирования | Лайки, счётчики, корзина |
Копнуть глубже
PACELC — расширение CAP. CAP описывает только ситуацию сетевого разделения. PACELC добавляет: а в нормальной работе (без сбоя) тоже есть выбор между Latency (задержкой) и Consistency. Согласованность требует, чтобы все реплики подтвердили запись до ответа клиенту — это задержка. Eventual Consistency (конечная согласованность) отвечает быстро, но данные временно расходятся между репликами.
Eventual Consistency — данные в конечном счёте станут согласованы. Типичный пример: вы лайкнули пост, 2 секунды счётчик на другой реплике показывает старое значение, потом синхронизируется. Для лайков — приемлемо. Для баланса банковского счёта — нет.
Strong vs Eventual Consistency в Spring. @Transactional обеспечивает сильную согласованность в рамках одного узла PostgreSQL. При работе с несколькими БД или микросервисами (Saga pattern — см. тему «Saga») получаем только eventual consistency — нет транзакции, охватывающей несколько сервисов.
Quorum-чтение/запись в Cassandra. Можно настроить: считать данные согласованными, если их подтвердило большинство (QUORUM) или все (ALL) реплики. QUORUM read + QUORUM write = strong consistency при наличии 3 реплик. ONE read + ONE write = скорость, но eventual consistency.
• что такое eventual consistency и когда она приемлема (если дошёл до 2-го слоя).