CAP-теорема: почему нельзя получить всё сразу
У тебя два кофейных ларька на разных концах Москвы. Утром ты решил поднять цену на капучино — было 300 рублей, стало 350. В первом ларьке продавец уже знает. Звонишь во второй — не берут трубку. Что делать?
Вариант первый: закрыть второй ларёк, пока не дозвонишься. Цена везде будет правильная, но клиенты уйдут — ларёк-то закрыт.
Вариант второй: пусть продают по старой цене. Клиенты довольны, кофе льётся, но кто-то получит капучино дешевле, чем должен.
Вариант третий: сделать так, чтобы связь никогда не рвалась. Но мы живём в реальном мире — связь рвётся всегда.
Это и есть CAP-теорема. Математик Эрик Брюер сформулировал её в 2000 году, а двое учёных — Гилберт и Линч — строго доказали в 2002-м. Изначально она про компьютерные системы, но на самом деле описывает ограничение, с которым мы сталкиваемся каждый день.
О чём вообще речь
За тремя буквами CAP стоят три простых свойства.
C — согласованность. Все части системы знают одно и то же. Не важно, в какой ларёк ты зайдёшь — цена на капучино одинаковая.
A — доступность. Система работает и отвечает. Ларёк открыт, продавец на месте, кофе можно купить.
P — устойчивость к разрыву связи. Система не разваливается, когда связь между её частями пропадает. Ларьки продолжают работать, даже если телефон между ними замолчал.
Теорема утверждает простую вещь: когда связь рвётся, приходится выбирать — либо все части системы говорят правду, либо все части системы продолжают работать. Одновременно и то, и другое — невозможно.
Как это выглядит на практике
Вернёмся к ларькам. Ты поднял цену, связь оборвалась. Дальше — три сценария.
Правда важнее работы. Второй ларёк перестаёт продавать капучино. «Извините, не могу — пока не знаю актуальную цену». Клиент разворачивается и уходит. Зато никто не получит кофе по неправильной цене. Это выбор в пользу согласованности.
Работа важнее правды. Второй ларёк продолжает наливать капучино по 300 рублей. Клиенты счастливы, очередь двигается. Но когда связь восстановится, выяснится, что часть чашек продана по заниженной цене. Это выбор в пользу доступности.
А если просто не допускать разрывов? Хорошая мысль, но нереалистичная. Телефоны разряжаются, интернет падает, серверы перезагружаются. В любой системе, где есть больше одной точки, связь рано или поздно оборвётся. Поэтому третий вариант — «пусть связь просто не рвётся» — это не выбор, а мечта.
Эта теорема работает далеко за пределами компьютеров
Вот что интересно: тот же самый выбор «правда или скорость» преследует нас в обычной жизни. Везде, где есть несколько участников и ненадёжная связь между ними.
Отношения на расстоянии. Пара живёт в разных городах. Каждое решение можно согласовывать — звонить, обсуждать, договариваться. Это честно, но медленно. Жизнь буксует, потому что каждый шаг требует синхронизации.
Другой путь — каждый живёт автономно, принимает решения сам, быстро двигается вперёд. Но рано или поздно выяснится, что один уже купил билеты на юг, а второй запланировал поездку к родителям.
Управление командой. Руководитель с тремя отделами. Хочешь, чтобы все знали обо всём? Придётся проводить бесконечные совещания. Информация точная, все синхронизированы — но работа стоит, потому что люди сидят на созвонах вместо того, чтобы делать дело.
Даёшь свободу? Отделы работают быстро, но один заказывает серверы, которые другой уже купил, а третий принимает решение, которое противоречит первым двум.
Воспитание детей. Мама сказала: «Никаких конфет до обеда». Папа этого не слышал. Ребёнок подходит к папе и просит конфету.
Если папа скажет «спроси у мамы» — это согласованный подход. Медленный, но правильный. Если папа просто разрешит — быстро, но потом окажется, что родители дали противоречивые ответы. Знакомо?
Новости и журналистика. Произошло что-то важное. Информация неполная, источники противоречат друг другу. Можно опубликовать быстро — будут ошибки, но ты первый. Можно проверить каждый факт — но к этому моменту все конкуренты уже рассказали свою версию. Скорость или точность — выбирай.
Во всех этих примерах один и тот же закон: когда связь между участниками ненадёжна, быстрый ответ и правильный ответ — это разные ответы.
А что в мире технологий?
Для тех, кому интересно, как этот выбор выглядит в реальных компьютерных системах.
Когда банк переводит деньги с одного счёта на другой, ему критически важна правда. Лучше показать «операция обрабатывается», чем списать деньги дважды. Поэтому банковские системы выбирают согласованность.
Когда ты листаешь ленту в социальной сети, тебе важно, чтобы она загружалась. Если один пост покажется на секунду позже или счётчик лайков чуть отстанет — ничего страшного. Поэтому соцсети выбирают доступность.
Причём это не выбор раз и навсегда. В одном и том же интернет-магазине корзина может работать по принципу «пусть всегда доступна» (потерять товар из корзины — неприятно, но не критично), а оплата — по принципу «пусть всегда точна» (деньги ошибок не прощают).
Частые ошибки в понимании
Есть несколько вещей, которые люди часто понимают неправильно.
Первое: кажется, что можно просто сделать идеальную связь. Нельзя. Провода рвутся, серверы падают, Wi-Fi пропадает. Вопрос не «порвётся ли связь», а «когда порвётся». Поэтому устойчивость к разрыву — это не опция, это реальность.
Второе: кажется, что нужно выбрать одну стратегию для всей системы. Не нужно. Разные части могут делать разный выбор — в зависимости от того, что для них важнее.
Третье: кажется, что CAP-теорема описывает всё. Не всё. Она ничего не говорит о скорости, о том, сколько запросов система выдерживает, и о том, как долго хранятся данные. Для более полной картины существует расширенная версия — PACELC — но это уже отдельная история.
Что из этого вынести
CAP-теорема — это не формула из учебника по программированию. Это способ думать о любой ситуации, где несколько участников пытаются действовать согласованно при ненадёжной связи.
Менеджер, журналист, родитель, инженер — все решают одну и ту же задачу. Что важнее прямо сейчас: ответить быстро или ответить правильно?
Правильного ответа на этот вопрос нет. Но осознанный выбор — уже половина решения.