Даже если мы только знакомимся с распределенными системами, то уже ясно, что данная система по определению состоит из множества движимых элементов. И эти части чрезмерно усложняют происходящее, потому как теперь, вместо шоу одного актера, перед нами предстает целая группа персонажей (узлов)!
В предыдущей статье мы попробовали разобрать ситуации, при которых самые простые вещи, воспринимаемые нами как должное, в рамках единой системы, значительно усложняются в распределенной системе. Мы узнали, что узлы могут автономно функционировать и выполнять свои операции. Можно сказать, что данное знание — это самая простая часть в изучении распределенных систем.
Ну, так как же узлы работают вместе? Если хорошо призадуматься, то получается, что автономные узлы, не работающие вместе, нарушают смысл распределения системы! Узлы в распределенной системе должны взаимодействовать друг с другом, что, как мы уже знаем, несколько усложняет ситуацию.
Так почему же мы хотим, чтобы узлы взаимодействовали и работали вместе? Какие возможности дает нам эффективно реализованная распределенная система? Самое время узнать об этом.
Прозрачность в системе
Распределенные системы все еще активно изучаются и исследуются. И если бегло пробежаться по теории, то мы получим неоднозначные результаты. Например, одно из самых популярных определений распределенных систем пошло от Лесли Лэмпорта, ученого в области информатики, лауреата премии Тьюринга.
Распределенная система — это когда поломка одного компьютера, о котором вы ничего не знаете, приводит к невозможности использования вашего собственного.
— Лесли Лэмпорт
Лично для меня, самое интересное в данном определении — это то, что многие события могут происходить даже без вашей осведомленности о них. Из определения Лэмпорта следует, что что-то может пойти не так (часть системы может сломаться), но вы (пользователи) даже об этом и не узнаете.
По-моему, центральным мотивом этой идеи является тот факт, что распределенная система что-то от вас скрывает.
Мы знаем, что распределенные системы всегда включают в себя множество машин/процессов/ресурсов (то есть узлов), которые могут располагаться в разных местах. Но при работе с распределенной системой все воспринимается единым целым. Другими словами, даже если мы, пользователи, взаимодействуем с несколькими узлами одновременно, нам это таковым не кажется. Наоборот, мы, скорее, считаем, что имеем дело с единой системой, машиной или процессом.
Например, при заказе какого-то товара в онлайн-магазине. В действительности мы получаем данные от одного узла, передаем их в другой узел, ожидаем ответа от третьего узла, который, в свою очередь, может зависеть от пары-тройки других узлов! Мы, конечные пользователи, видим неразрывный процесс, создающий иллюзию взаимодействия с единым сайтом или платформой. Но на деле это оказывается множеством узлов, работающих вместе для того, чтобы процессы казались единым целым.
Это основная концепция распределенных систем, также известная как прозрачность распределения. Распределенная система, состоящая из нескольких узлов, но кажущаяся единой системой, называется прозрачной.
Прозрачность — это главный критерий при разработке распределенной системы. Прежде всего, прозрачность отвечает за то, как именно узлы системы работают вместе. Иначе говоря, прозрачность системы показывает, каким образом она скрывает свое «распределение» и представляется конечному пользователю единой системой (то есть, нераспределенной)
Но что значит скрывать «распределение» распределенной системы?
На самом деле, если представить такую систему в виде группы различных узлов, — распределенных в пространстве, но работающих сообща, — то можно прийти к выводу, что в ней будет присутствовать множество элементов, которые потребуется «скрыть». Например, прозрачность может скрывать тот факт, что система обрабатывает данные различных узлов. Или же, что данные располагаются и хранятся в разных узлах, работающих вместе.
Не столь важно, как именно система добивается прозрачности. Основная цель прозрачности распределения заключается в создании иллюзии того, что система — это не группа разрозненных элементов (узлов), а одно целое (единая система). Важно отметить, что иллюзия прозрачности системы создается не только для конечных пользователей, но и для программистов, работающих с данной системой, а также потенциальных приложений, которые могут периодически обращаться к системе.
Методы сокрытия информации
Теперь, когда мы разобрались с целью разработки распределенной системы, пора погрузиться в практические аспекты.
При создании или наблюдении за распределенной системой можно по-разному подойти к реализации прозрачности. В основном, все сводится к тому, какое поведение системы мы хотим скрыть. В зависимости от архитектуры системы, одни ее части намного проще изобразить в виде «единого целого», чем другие. Все станет понятнее, когда мы познакомимся с различными формами прозрачности в распределенной системе. Давайте начнем!
Прозрачность доступа
Во многих системах способ доступа к ресурсу (объекту, данным, процессу и даже машине) может существенно отличаться от его реального представления и отображения. Например, если в распределенной системе используются узлы с различной операционной системой. Это означает, что представление одного и того же ресурса в разных узлах будет слегка отличаться.
Несмотря на то, что реальное представление ресурса может сильно различаться, для создания иллюзии единой системы нам придется скрыть это от конечных пользователей. Прозрачность доступа — это как раз то, что позволяет скрывать различия в представлении данных ресурса и его доступности.
Отличным примером прозрачности доступа служит хорошо нам знакомый интерфейс приложений, он же API! API — это надежный способ получения доступа к ресурсу/ресурсам, который можно повторить с любой машины и получить одинаковый результат. Даже при изменении своей формы или структуры, эти данные будут скрыты от конечных пользователей. А в случае API они будут также скрыты от программистов и внешних приложений, использующих API, как службы. Прозрачность доступа абстрагирует эти данные для гарантированного доступа к ресурсу, даже при различном его представлении в какое-либо время или в каком-либо месте.
Чем больше мы об этом думаем, тем быстрее осознаем, сколько всего разного скрывает прозрачность доступа! Например, ваша возможность прочитать данную статью на каком-то ресурсе — это тоже результат прозрачности доступа! В интернете прозрачность доступа используется для сокрытия того факта, что веб-страница одинакова доступна (по URL) с ноутбука, мобильного устройства, старой или новой операционной системы. Еще одна иллюзия!
В то же время, с прозрачностью доступа все не так просто. Что случится, если наша система представит ресурс в таком виде, что устаревшая/старая операционная система его не «увидит» (или «увидит» некорректно)? Ну, тогда, скорее всего, что-то пошло не так с нашим доступом к ресурсу! В таком случае, конечный пользователь заметит, что работает не в единой системе. Поэтому желаемая «иллюзия» прозрачности разрушится.
Прозрачность расположения
Помимо различного представления ресурса в узлах распределенной системы, эти же самые ресурсы могут располагаться в различных местах! Прозрачность расположения скрывает точное место, где находится ресурс. Такая форма прозрачности предоставляет постоянный доступ к объектам внутри системы, без привязки к расположению (тем более, что расположение может быть и не известным).
Интернет является отличной иллюстрацией данного типа прозрачности. Например, сайт живет по вполне известному адресу — URL. Однако место «физического» существования в интернете скрывается, потому как конечный пользователь может найти этот ресурс (веб-страницу) в логически обозначенном месте. URL означает «единый указатель ресурса», и это еще один пример того, как имя ресурса не говорит ни слова о местоположении ресурса (например, где находится сервер).
Интернет — это не единственный пример прозрачности расположения. В системе могут присутствовать встроенные объекты, хранящиеся в базе данных, или существующие в статичном файле. В любом случае, прозрачность расположения скрывает эти «подробности» от конечного пользователя и просто предоставляет гарантированный доступ к объекту, вне зависимости и без указания его расположения.
Прозрачность перемещения
Теперь, когда мы узнали, что ресурсы могут «жить» в разных местах, можно догадаться и о том, что ресурсы могут перемещаться. То есть ресурс живет в одном узле, а потом его необходимо перенести в другой. Прозрачность перемещения позволяет ресурсам перемещаться из одного узла в другой в процессе использования/доступности.
Для прозрачности перемещения требуется слаженная работа двух составляющих. Во-первых, перемещаемый ресурс должен быть способен к этому «перемещению». Например, при копировании в другое место. Во-вторых, ресурс должен «скрыть» факт своего «перемещения», поскольку кто-то (конечный пользователь, программист, даже другой узел распределенной системы!), скорее всего, к нему в данный момент обращается.
Оба этих аспекта необходимо учитывать. Поэтому реализация прозрачности перемещения в распределенной системе может оказаться довольно сложной и замысловатой процедурой. Иногда ею пренебрегают, если «перемещение» ресурсов происходит не так часто. Временами, в таких случаях лучше просто отключить ресурс от сети и выполнить перемещение в офлайн.
Если же к вашему ресурсу обращается много пользователей, или вы часто перемещаете ресурсы, то пренебрежение данной формой прозрачности приведет к тому, что распределенная система перестанет казаться единым целым. Для конечного пользователя она будет не совсем прозрачной, что может сказаться на самоцели создания распределенной системы.
К этому моменту мы уже понимаем главное: одни формы прозрачности сложнее других. Но каждая ее разновидность направлена на «маскировку» определенных подробностей системы от конечных пользователей и требует значительного осмысления!
Перевод статьи Vaidehi Joshi: Transparency: Illusions of a Single System (Part 1)