Ответ
CAP-теорема (теорема Брюера) — это фундаментальный принцип проектирования распределенных систем, который гласит, что любая распределенная система может одновременно гарантировать только два из трех следующих свойств:
- Consistency (Согласованность): Все узлы системы видят одни и те же данные в один и тот же момент времени. Любое чтение вернет результат последней успешной записи.
- Availability (Доступность): Любой запрос к работающему узлу системы завершается корректным откликом, без ожидания или ошибок. Система всегда доступна для чтения и записи.
- Partition Tolerance (Устойчивость к разделению): Система продолжает функционировать корректно даже в случае потери сетевых сообщений между узлами (возникновения "раздела").
Ключевой выбор
Поскольку в реальных распределенных системах сетевые сбои (partitions) неизбежны, свойство P (Partition Tolerance) является обязательным. Поэтому на практике выбор сводится к двум моделям:
-
CP (Consistency + Partition Tolerance): Система жертвует доступностью ради согласованности. В случае сетевого раздела часть узлов может стать недоступной (например, для записи), чтобы избежать рассинхронизации данных.
- Примеры: Реляционные СУБД (PostgreSQL, MySQL в кластерных конфигурациях), MongoDB.
-
AP (Availability + Partition Tolerance): Система жертвует согласованностью ради доступности. В случае раздела все узлы остаются доступными, но некоторые из них могут возвращать устаревшие данные. Согласованность достигается позже (eventual consistency).
- Примеры: Amazon DynamoDB, Cassandra, Riak.
Ответ 18+ 🔞
Так, слушай, про распределённые системы. Есть у них там одна теорема, как закон подлости, только для данных. Называется CAP, или теорема Брюера, если по-паспорту.
Короче, суть в чём: представь, у тебя данные размазаны по куче серверов. И система эта, блядь, в идеале хочет три вещи сразу, но нихуя не выходит — только две из трёх. Как в жизни: работа, личная жизнь, здоровье — выбери два, третье нахуй сгорит.
Вот эти три хотелки:
- C — Согласованность (Consistency). Это чтобы не было пиздеца. Где бы ты ни прочитал данные — в Питере, в Магадане, на хуторе близ Диканьки — везде должна быть одна и та же, блядь, последняя версия. Записал "100 рублей" — везде сразу "100 рублей", а не "50" на каком-то левом узле.
- A — Доступность (Availability). Это чтобы система не ссыла в кусты. Ты к ней стучишься — она тебе всегда, сука, отвечает. Не важно, что там у неё внутри — пожар, наводнение, — она должна выдать ответ, даже если это старые данные. Главное — не молчать и не показывать "ошибку 500", как последняя мартышлюшка.
- P — Устойчивость к разделению (Partition Tolerance). А это признание суровой правды жизни: сеть — она ненадёжная, ёпта. Кабели рвутся, свитчи горят, операторы косячат. И система должна это переживать. Допустим, один дата-центр отъехал в цифровое небытие, а остальные — живы. Вот это и есть раздел.
И вот тут, блядь, главный подвох. В реальном мире, где сети глючат чаще, чем у тебя интернет в час пик, свойство P — это не выбор, а обязаловка. Иначе система просто сдохнет при первом же чихе маршрутизатора.
Поэтому выбор на самом деле простой, как три копейки:
-
CP (Согласованность + Устойчивость к разделению). Выбираешь, если правда — дороже всего. Когда случается пиздец (раздел сети), система блокирует часть узлов для записи, чтобы не допустить рассинхронизации. Лучше временно стать недоступным, чем дать людям прочитать хуйню.
Кто так живёт: Классические реляционные базы в кластере (PostgreSQL, MySQL), всякие Zookeeper'ы. Там, где финансовые транзакции или важные состояния — хуй с ним, с доступностью, зато везде одна цифра. -
AP (Доступность + Устойчивость к разделению). Выбираешь, если система должна жить, несмотря ни на что. При разделе все узлы продолжают отвечать, но могут показать тебе вчерашние, ебаные, данные. Согласованность будет "в итоге" (eventual consistency), когда сеть починят.
Кто так живёт: Динамики всякие (Amazon DynamoDB), Cassandra. Соцсети, кэши, корзины покупок — там можно секунду потерпеть старые данные, зато сайт не ляжет.
Вот и вся философия. Либо ты точный, но иногда недоступный зануда (CP), либо всегда на связи, но слегка поехавший чувак, который может нести пургу (AP). Третьего, блядь, не дано.