CAP theorema

CAP theorema

KarmanovichDev

Одними из важнейших показателей в распределённых системах вычислений являются:


  • Consistency(Согласованность данных) - Данные, находящиеся на разных вычислительных узлах, не противоречат друг другу(содержат одинаковую информацию). Если, в вашей системе есть X вычислительных узлов(серверы с приложением), тогда ответы от всех серверов в любой момент должны совпадать.
  • Availability(Доступность системы) - Любой запрос к распределённой системе должен быть корректно обработан, даже если часть узлов недоступны. Позволяет поддерживать работоспособность сервиса при ограниченной доступности ресурсов.
При выборе доступности есть шанс получить устаревшие данные.


  • Partition tolerance(Устойчивость системы к разделению) - Способность системы продолжать работу, даже при сетевом разделении между отдельными компонентами системы. Сетевой сбой, это про ситуацию, когда узлы продолжают работать и доступны для клиента, но потеряли связь между собой.


Теперь, понимая, что из себя представляют основные характеристики распределённых систем вычислений, мы можем перейти к самОй теореме.


CAP Теорема(Брюера) - Утверждение, что нельзя соблюсти более двух из трёх(Consistency, availability, partition tolerance) характеристик сразу, для любой системы распределённых вычислений.


  • AP(cassandra, couch db, riak, ...) - Обеспечивает доступность данных и устойчивость к разделению в ущерб согласованности. Каждый из узлов готов принимать данные, но не гарантирует сроков, в которые изменения будут распространены по системе(eventually consistent). Примерами могут служить, распределённые веб-кэши, DNS.


Если мы гарантируем доступность наших вычислительных узлов, при возможности сетевого разделения, то мы жертвуем согласованностью данных.


  • CA(MySQL, PostgreSQL, SQLServer, MariaDB, ...) - Данные во всех узлах согласованы, и доступ к системе заканчивается корректным откликом, но нет устойчивости к разделению. Для таких систем требуется поддержка ACID-требований к транзакциям и надёжность сети.
Клиент получит ответ, как только во всей системе будут согласованные данные.


  • CP(Redis, MongoDB, Google Big Table, ...) - В любой момент обеспечивается согласованность данных и работа при сетевом разделении в ущерб доступности системы. При отказе части узлов можно продолжать делать запросы на чтение.

Скорее всего, разрабатывая распределённые системы вычислений, вы будете выбирать устойчивость к сетевому разделению, как требуемую характеристику по умолчанию.

Из этого можно сделать вывод, что такая система изначально должна быть устойчива к разделению и дополнительно выбирать между согласованностью и доступностью.


Какие проблемы в CAP?

  • Например, в CA/CP вы могли бы пренебречь частью некритических данных и позволить пользователю менять/запрашивать их, а синхронизацию произвести позднее, когда пройдёт сетевое разделение. Тем самым у вас бы был не полный, но CAP. На деле в теореме такого не подразумевается, каждая характеристика должна быть выполнена на 100%.
  • Для доступности нет никаких рамок задержки(latency). Если ваш запрос к приложению выполнялся час и после отдаёт успешный ответ, то ваше приложение считается доступным, так как оно корректно обработало входящий запрос.
  • Чистые CP системы в теории могут никогда не прийти в согласованное состояние и вернуть вам корректный ответ.
  • Есть множество статей, которые утверждают, что чистый CAP неприменим в текущих реалиях. В том числе поэтому появились такие вещи как PACELC, BASE-архитектура.


Это была базовая статья о CAP-Теореме. Если статья вам понравится, то в дальнейшем я могу:

  • Углубиться в CAP
  • Написать отдельную статью про PACELC и BASE как иной подход к решению проблем в распределённых системах вычислений.

Report Page