Введение

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

КЕПКА

Идея теоремы CAP состоит в том, чтобы визуализировать эти три компромисса, у вас может быть только два из них!!

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

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

Partition Tolerance определяет способность системы обрабатывать сетевые разделы, когда узлы могут стать временно недоступными или сетевые сообщения могут задерживаться или теряться. В распределенной системе устойчивость к разделам гарантирует, что система продолжает функционировать даже при сбоях в сети.

Почему я не могу иметь все три?

Распределенная система не может иметь все три, например, предположим, что наша система сначала имеет P (что означает, что она может обрабатывать разделы). Столкнувшись с сетевыми разделами, система должна выбирать между поддержанием согласованности (когда все узлы видят одни и те же данные) или обеспечением высокой доступности (отвечая на запросы даже с потенциально несогласованными данными). Если сеть разделена, мы можем либо снизить доступность и поддерживать согласованность (поместив в карантин отдельные части сети), либо снизить согласованность, но сохранить доступность (поддерживая эти отдельные узлы в рабочем состоянии и рискуя несогласованностью данных в сети).

Доступность против согласованности

Реальный вопрос заключается в том, хотите ли вы, чтобы ваша система была доступна ИЛИ согласована в случае сетевого раздела. Распределенные системы ВСЕГДА имеют сетевые разделы, поэтому, если вы не хотите поддерживать Partition Tolerance, у вас будет система с одним узлом, что противоречит цели «распределения».

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

Система AP была бы хороша для систем с высоким трафиком, где возможная согласованность в порядке (например, приложение для социальных сетей или CDN).

ПАСЕЛК

CAP имеет расширение под названием PACELC, что означает:

  1. В разделенном состоянии вы предпочитаете доступность или согласованность?
  2. В неразделенном состоянии вам нужна низкая задержка или согласованность?

Мы рассмотрели первую часть в рамках CAP, теперь мы обратимся ко второй.

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

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

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

Заключение

Проектирование системы сопряжено с множеством компромиссов, и важно понимать теоретические ограничения системы. В следующий раз, когда вы захотите построить большую распределенную систему, я надеюсь, что первым делом в вашем контрольном списке будет подумать: «Должна ли моя система быть высокосогласованной или высокодоступной?» потому что, к сожалению, мы не можем иметь свой пирог и съесть его, когда дело доходит до сетей.