Автор: Kaushik Sathupadi (перевод Артем Попов)
Источник: A plain english introduction to CAP Theorem (перевод Артем Попов)
Вчера, когда ваша супруга в очередной раз оценила тот факт, что вы вспомнили о её дне рождения и подарили шикарный подарок, в голове всплыла забавная идея. «Хм, а ведь люди вечно всё забывают». А у вас просто блестящая память! Почему бы не сделать новый сервис, который позволит полностью раскрыться вашему таланту? С каждой мыслью об этой идее вам всё больше и больше она нравится. Вы уже даже придумали рекламу, которую можно было бы напечатать в газете:
«Позвони, напомню» — Никогда не забывайте, даже если вы не помните, что забыли!
Плохо себя чувствуете из-за того, что вы что-то забыли? Не переживайте. Помощь на расстоянии одного телефонного звонка!
Если вам нужно что-то запомнить, просто позвоните и сообщите нам об этом! Допустим, позвоните нам и сообщите телефон вашего босса. Забудьте про него. Когда вам нужно будет вспомнить его, перезвоните, и мы вам обязательно напомним.
Всего 3 рубля за звонок.
Типичное обращение в ваш сервис выглядело бы вот так:
Прошло несколько месяцев...
Ура, дело пошло! Ваша идея настолько проста, насколько эффективна. Сервис выстреливает, вы получаете сотни заказов каждый день. Всё бы хорошо, но появилась проблема: всё больше и больше клиентов ждёт своей очереди поговорить с вами. Некоторые не выдерживают ожидания и просто бросают трубку. Более того: когда вы заболели и не могли работать, пропал целый день бизнеса и вся выручка. И это ещё не говоря о неудовлетворённых клиентах, потерявших возможность получить информацию. Решено — пора расширяться! Возьмём супругу в помощь.
Итак, план простой:
Вы очень взволнованы этой идеей, ведь:
Шикарно! Это же распределённая система! И почему все эти ребята, делающие софт, так шумят по поводу распределённых систем, всё же так просто!
Всё идёт по плану, до того как…
Через два дня после внедрения новой системы вы получаете звонок от вашего постоянного клиента, Ивана Андреевича:
Через день Иван Андреевич снова звонит вам:
Как это вообще могло произойти? Может Иван Андреевич просто наврал? Вы размышляете о том, что случилось, и вам в голову врезается мысль. Может быть Иван Андреевич позвонил вашей жене? Вы находите её записную книжку, и, о да, как вы и предполагали, на страничке Ивана Андреевича указано то, что он должен был уехать в Нью-Йорк вчера.
Какой ужасный изъян вашей, казалось бы, прекрасной схемы! Ваша распределённая система не согласована! Всегда есть шанс того, что клиент сообщит что-то вам или вашей жене, а следующим звонком он попадёт к другому человеку, который не будет в курсе последних изменений.
Ваши конкуренты могли бы спокойно игнорировать плохое обслуживание, но вы, конечно, заботитесь о своих клиентах и репутации. Пока ваша жена спала, вам не давала покоя проблема, вы всю ночь думали и пытались найти выход и ситуации. Бинго! Когда жена проснулась, вы в тот же момент ей говорите о новых планах:
Вы замечаете единственную проблему — вы не можете работать параллельно. Каждый раз, когда вам звонит коллега для синхронизации, вы не можете отвечать на звонки клиентов — вы будете заняты. Но это не так уж и страшно, ведь большинство звонков поступает с просьбами что-то напомнить (поиск), а не что-то запомнить (обновление).
Главное — ответить клиенту правильно любой ценой.
«Отлично», говорит вам супруга, «Однако есть ещё одна брешь, о которой ты не подумал. Что, если в один прекрасный день кто-то не сможет выйти на работу? Тогда у нас не получится принять ни единой просьбы запомнить, ведь другой человек не сможет записать изменения в свою записную книжку. Это, братец, у нас получается проблема доступности, так как, к примеру, если запрос на обновление придёт ко мне, я не смогу завершить звонок клиента: даже если я записала изменения в свою записную книжку, у меня не выйдет записать их в твою. Таким образом, я не смогу попрощаться с клиентом!»
Вы уже осознали, почему распределённые системы не такие простые, как вы думали. Сложно ли придумать решение, которое было бы одновременно «доступно и согласовано»? Кто-нибудь может и сдался, но не вы! Ваши конкуренты и не мечтали о том, что вы придумали. И вновь вы нетерпеливо будите свою жену…
«Смотри, это то, что нам нужно для доступности и согласованности.» План почти такой же, как в прошлый раз, но с важными изменениями:
Гениально! Вы не можете найти ни одного недостатка в получившемся решении. Теперь «Позвони, напомню» одновременно доступный и согласованный сервис.
Кажется, всё отлично уже который день. Ваша система согласована. Всё работает, даже если кто-то из вас не может выйти на работу. Но что выйдет, если вы оба вышли на работу, но один из вас не может обновить информацию другого? Помните, как вы будили свою жену с очередным Гениальнейшим Бредом? Что, если ваша жена решится принимать звонки, но будет слишком обижена на вас и решит не разговаривать с вами весь день? Весь ваш бизнес опять превратится в тыкву! Ваша идея до сих пор хороша за её согласованность и доступность, но очень чувствительна к разделению коммуникаций! Вы конечно, можете не принимать ни одного звонка, пока вы в ссоре, но тогда ваша система будет недоступна всё это время…
Итак, давайте теперь взглянем на CAP-теорему. Утверждается, что при разработке распределённой системы вы не можете достичь одновременно трёх свойств: доступность, согласованность и терпимость к разделению сети. Вы можете выбрать только два из:
Вот вам ещё один повод поразмыслить. Вы можете нанять курьера. Он будет обновлять вашу или записную книжку супруги в тот момент когда изменилась информация в другой книжке. Самая большая выгода от подобного подхода в том, что он может работать в «фоновом режиме» и чьё-либо обновление ни блокирует другого человека для того, чтобы обновиться. Таким образом работает множество NoSQL решений, одна нода локально обновляет себя и фоновый процесс синхронизирует остальные ноды соответственно. Единственная проблема заключается в том, что теряется согласованность на некоторое время. Например, клиент звонит вашей жене и до того момента, пока курьер добежит до вас, он перезванивает и попадает на линию к вам. Как видите, он получит несогласованный ответ. Но всё равно, это остаётся отличной идеей, если подобные случаи ограниченны. Например, наши клиенты не страдают амнезией и не забывают то, о чём они сообщили 5 минут назад.