CAP Теорема

| September 14, 2022

Название CAP-теорема (читается “кап теорема”), а точнее сам акроним получен от первых букв трёх свойств, которые теорема, собственно, и рассматривает:

  • Consistency - непротиворечивость или согласованность
  • Availability - доступность
  • Partition tolerance - устойчивость к секционированию

Теорема гласит, что распределённая система может обеспечивать не больше двух из трёх упомянутых свойств, и, она активно используется в проектировании распределённых систем. Давайте подробнее рассмотрим каждое из этих свойств.

Теория

Свойства теоремы CAP

Если речь идёт о распределённых системах, то в воздухе где-то рядом витает пресловутый термин - “микросервисы”. Расскажу о свойствах CAP-теоремы на примере микросервисной архитектуры.

Consistency

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

Что это означает? Что в любой момент времени, на всех узлах, после изменения, данные будут согласованными, то есть - одинаковыми и наиболее актуальными. Рассмотрим следующий пример, как это могло бы выглядеть в реальной архитектуре:

Рисунок 1. Согласованность данных на нескольких узлах

  1. Пользователь обновляет собственный заказ в созданном специально для этого сервисе.
  2. Ещё до того, как Пользователь получит ответ от Order Service, распределённая система заботится о согласованности данных и сохраняет детали внесённых пользователем изменений в специализированный сервис - History Service.
  3. После изменения, внесённого Пользователем в систему, Администратор получит самые актуальные данные из любого инстанса любого сервиса - будь-то любой инстанс Order Service‘а, который вернёт детали пользовательского заказа, или же History Service, любой инстанс которого, вернёт актуальную историческую информацию о внесённых изменениях.

Availability

Доступность означает, что любой клиент, запрашивающий данные, получает ответ, даже если некоторые из узлов недоступны.

Примером, тут может быть распределённая система, развёрнутая в Kubernetes:

Рисунок 2. Доступность системы

На схеме выше, изображена распределённая система, размещённая в Kubernetes, у которой вышли из строя как целый узел Node 2, так и отдельный инстанс сервиса из узла Node 1. При этом, система продолжает реагировать на запросы пользователя и возвращает данные, не обязательно согласованные.

⚠️ В этом примере, Kubernetes я использовал для удобства изображения и более прикладного примера. Сам Kubernetes здесь никакого значения для свойств CAP-теоремы не несёт и служит скорее иллюстрацией одного из инфраструктурных решений.

Partition tolerance

Устойчивость к секционированию означает, что система продолжает работать вопреки нарушению связи в сети, между её узлами.

Примером послужит следующая схема:

Рисунок 3. Устойчивость к секцианированию

Это та же схема, которая используется для иллюстрации примера с согласованной системой, с одним изменением - на 2ом шаге работы описанного выше алгоритма, связь между Order Service и History Service нарушена.

Свойство Partition tolerance гласит, что в этом случае, распределённая система должна продолжить нормально функционировать.

Классификация распределённых систем

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

Классификация распределённых систем производиться согласно поддерживаемым свойствам CAP-теоремы.

Рисунок 4. Классификация распределёных систем

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

Рассмотрим их подробнее:

  • CA системы - это согласованные и доступные системы. Такие системы жертвуют устойчивостью к секционированию. Поскольку сетевые сбои неизбежны - такой класс систем не существует в реальных условиях.
  • AP системы - это доступные и устойчивые к секционированию системы. Такие системы жертвуют согласованностью.
  • CP системы - это согласованные и устойчивые к секционированию системы. Такие системы жертвуют доступностью.

Заключительная часть

Если Вы работаете над созданием собственных микросервисов, или же отвечаете целиком за архитектуру распределённой сети, CAP теорема послужит отличной “пищей для ума” при разработке дизайна и требований новых сервисов.

Список материалов

Дополнительный материал