CAP теорема

CAP теорема

Всем привет!

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

В общем случае принято разделять свойства (требования) системы на функциональные и нефункциональные.

Функциональные свойства — это то, что система делает с точки зрения пользователя.

Нефункциональные свойства — это то, как система работает: различные характеристики, ограничения и требования - доступность системы, время ответа, устойчивость к сбоям и т. п.

Если говорить о нефункциональных свойствах, то их можно отнести к трем основным группам:

  • Consistency (C / Согласованность): каждое обращение к системе всегда отдаст актуальные данные. То есть все клиенты видят одни и те же данные в каждый конкретный момент.
  • Availability (A / Доступность): каждый запрос к системе всегда вернет данные, даже если они устаревшие или неполные. Другими словами, клиент всегда получает данные, даже если часть узлов системы не доступны.
  • Partition Tolerance (P / Устойчивость к разделению): система должна работать, даже когда потеряна связь между 2 и более узлами.

CAP теорема

Теорема CAP, известная также как теорема Брюера, говорит о том, что в распределенной системе возможно добиться удовлетворения лишь 2 из 3 основных свойств системы. Поэтому существует 3 комбинации этих характеристик: CA, AP и CP.

CAP теорема

Почему не получится удовлетворить сразу 3 свойствам? Представим систему, состоящую из 2 узлов — M (master) и S (slave), в системе осуществляется репликация данных с использованием подхода master-slave (то есть один узел главный, а другой постоянно обновляет свое состояние в соответствии с главным). Представим, что нарушается связь между узлами и нам необходимо сохранить работоспособность системы (P), в этом случае мы можем удовлетворить только 1 свойству:

  • Согласованности (С) — тогда нужно запретить запись в M, иначе данные, которые мы получим с S, будут отличаться (отказываемся от A).
  • Доступности (A) — мы допускаем, что данные с узла S будут некоторое время неактуальны (отказываемся от C).
CAP теорема
  • Таким образом, в условиях нарушения связи между узлами (P) мы не можем одновременно удовлетворить и согласованности (С) и доступности (A).

Ограничения CAP теоремы

Важно понимать, что CAP теорема — это попытка классифицировать абстрактные свойства системы. В реальности, как и у любой теории, у нее есть ограничения, к таким ограничениям можно отнести следующие:

  • CAP подразумевает, хотя явно не говорит об этом, что все характеристики бинарны (либо есть, либо нет). Но в реальности свойства могут проявляться лишь частично.
  • Не учитывает фактор задержки — если запросы долгие (не удовлетворяют требованиям), то доступность вроде бы присутствует, но можно ли называть такую систему доступной?
  • Фокус только на 2 свойствах ограничивает разработчиков системы, но в реальности можно спроектировать систему так, чтобы все характеристики более-менее удовлетворяли всем трем ограничениям.
  • Сетевое разделение — не единственный фактор, который нужно учитывать при проектировании, могут появляться множество других ошибок и сбоев.

В дополнение к CAP теореме существует теорема PACEL, которая расширяет ее и добавляет дополнительные свойства и является более приближенной к реальности.

Как применять CAP теорему

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

При формировании требований и согласовании их с заказчиком учитывайте ограничения используя CAP. Это позволит сразу убрать недопонимания и сформировать правильные ожидания от системы.

Подпишись на мой telegram-канал

1 комментарий