Все файлы к данному курсу Вы можете скачать здесь.
Информационные технологии являются, пожалуй, одной из наиболее динамично развивающихся областей современной экономики. Все увеличивающаяся мощность современных вычислительных устройств и их миниатюризация приводят к тому, что они находят все большее применение во всех областях человеческой деятельности. Согласитесь, сложно представить себе современное общество, скажем, без трансконтинентальных перелетов, современных лекарственных препаратов, возможности прогнозирования погоды, телевидения и т.д. и т.п., не говоря уже о таких "мелочах", как глобальная сеть Internet или сотовая связь.
Информационные системы окружают нас повсюду, область их применения постоянно расширяется, а сами они становятся все более и более сложными. Некоторые системы вырастают и усложняются настолько, что приобретают глобальный характер, и от их правильного и надежного функционирования начинает зависеть деятельность десятков или даже сотен тысяч людей. В силу своей "глобальности" (нужно обеспечить доступ к системе из территориально разнесенных между собой точек), а также в силу ряда других причин такие системы часто имеют очень сложную архитектуру, предполагающую их функционирование в виде набора компонентов, каждый из которых выполняется на отдельном узле. Поскольку число таких систем постоянно возрастает, требования, предъявляемые к ним, достаточно серьезны,
сложность проектирования и разработки таких систем высока, а методы и средства, применяемые при реализации таких проектов, отличны от принятых при разработке "монолитных" систем - существует необходимость в специализированных курсах.
Следует отметить, что на распределенные системы и обработку
Далее, используя термин "распределенная система", мы будем подразумевать взаимосвязанный набор автономных компьютеров, процессов или процессоров. Компьютеры, процессы или процессоры будут упоминаться как узлы распределенной системы. Будучи определенными как автономные, узлы должны быть, по крайней мере, оборудованы своим собственным блоком управления. Таким образом, ) не подпадает под определение распределенной системы. Чтобы быть определенными как взаимосвязанные, узлы должны иметь возможность обмениваться информацией.
Так как процессы могут играть роль узлов системы, определение включает программные системы, построенные как набор взаимодействующих процессов, даже если они выполняются на одной аппаратной платформе. В большинстве случаев, однако, распределенная система будет, по крайней мере, содержать несколько процессоров, соединенных коммутирующей аппаратурой.
Более ограничивающие определения распределенных систем могут быть также найдены в литературе. Tanenbaum [1], например, называет систему распределенной, только если существуют автономные узлы, прозрачные для пользователей системы. Распределенная система в этом смысле ведет себя как виртуальная самостоятельная компьютерная система, но реализация этой прозрачности требует разработки замысловатых алгоритмов распределенного управления.
Не следует думать, что распределенные системы - изобретение последних лет.
Два-три десятилетия назад при построении информационных систем популярной была модель "хост-компьютер + терминалы", реализованная на базе мэйнфреймов (например, IBM-360/370 или их отечественных аналогов - компьютеров серии ЕС ЭВМ), либо на базе так называемых мини- ЭВМ (например, , также имевших отечественный аналог - СМ-4 ). Характерной особенностью такой системы была полная "неинтеллектуальность" терминалов, используемых в качестве рабочих мест, - их работой управлял все тот же хост-компьютер.
Этот подход обладал несомненными по тем временам достоинствами. Во первых, пользователи такой системы могли совместно использовать различные ресурсы хост-компьютера (оперативную память, процессор) и довольно дорогие для тех времен периферийные устройства (принтеры,
Начавшийся бурный рост индустрии персональных компьютеров поначалу мало что изменил в идеологии построения программных систем - по-прежнему в большинстве своем программы имели дело с локальными ресурсами. Правда, часть этих ресурсов была уже "псевдолокальной" - например, файлы на сетевом диске, однако, по-прежнему файл обрабатывался непосредственно самим узлом, при этом файл сначала передавался по сети (уже на этом этапе развития возникли сложности - проблемы блокировки ресурсов и предупреждения тупиков, проблемы поддержки логической целостности для вносимых изменений и т.д.). В какой-то момент стало очевидно, что традиционные подходы не работают. При увеличении объема перерабатываемых данных, а также по мере возрастания их стоимости стало очевидно, что доверять их обработку клиентским машинам нельзя - любая ошибка на них (а чем больше клиентов, тем больше вероятность ошибки) приводит либо к потере консистентности данных, либо к их блокировкам в процессе работы, а, стало быть, к снижению общей производительности системы.
Следующим ключевым шагом стало повсеместное распространение идеологии клиент-серверной обработки. Это были "двухролевые" системы: клиент нес ответственность за отображение пользовательского интерфейса и выполнение кода приложения, а роль сервера обычно поручалась СУБД. В применении к примеру с файлом переход к клиент-серверной архитектуре может быть проиллюстрирован следующим образом: вместо того, чтобы читать файл целиком и обрабатывать его, машина-клиент передает машине-серверу запрос, в котором указывает, каким образом файл должен быть обработан. Сервер запрос клиента обрабатывает и возвращает ему результат.
С появлением и дальнейшим усложнением подобных систем очевидную значимость приобрело понятие "программного слоя".
Концепция слоев (уровней, layers ) - одна из общеупотребительных моделей, используемых разработчиками программного обеспечения для разделения сложных систем на более простые части. В архитектурах компьютерных систем, например, различают слои кода на языке программирования, функций операционной системы, драйверов устройств, наборов инструкций центрального процессора и внутренней логики чипов. В среде сетевого взаимодействия протокол FTP работает на основе протокола TCP, который, в свою очередь, функционирует "поверх" протокола IP, расположенного "над" протоколом Ethernet.
При таком подходе выделяют верхний слой, описывающий систему в целом (в силу того, что на нем упущено большинство малозначимых деталей, он оказывается обозримым), под ним располагается более низкий слой, на котором делается описание (реализация) используемым верхним уровнем операций и т.д. Таким образом, если смотреть снизу вверх, то получается, что каждый нижележащий слой обеспечивает функциональность, которую использует вышележащий для обеспечения сервисов более высокого слоя.
Расчленение системы на слои предоставляет целый ряд преимуществ.
Схема расслоения обладает и определенными недостатками.
Однако самое трудное при использовании архитектурных слоев - это определение содержимого и границ ответственности каждого слоя.
Повсеместный переход на технологию "клиент-сервер" помог решить много старых проблем, но при этом создал много новых. Одной из основных трудностей было и остается определение границы между функционалом клиента и сервера. Часто решение о переносе части задач на сервер пагубно сказывается на общей производительности системы, и наоборот, перенос части нагрузки на клиента может привести к потере централизации.
По мере роста популярности систем "клиент/сервер" набирала силу и технология объектно-ориентированного программирования, которая предлагала перейти к системной архитектуре с тремя слоями: слой представления отводится пользовательскому интерфейсу, слой предметной области предназначен для описания основных функций приложения, необходимых для достижения поставленной перед ним цели, а третий слой представляет источник данных.
С появлением Web всем внезапно захотелось иметь системы "клиент/сервер", где в роли клиента выступал бы Web -браузер. Появившиеся инструментальные средства конструирования Web -страниц были в меньшей SQL и потому более подходили для реализации третьего уровня.
В настоящее время можно считать, что бум технологий, связанных с клиент-серверной архитектурой, все еще продолжается - большинство работающих в настоящее время информационных систем выполнено в этой технологии. Однако актуальными являются направления, связанные с развитием этой идеи - так называемые трехслойные и многослойные, а также децентрализованные приложения.
Зачастую предпочтительнее использовать распределенные системы, а не монолитные, или их использования бывает просто не избежать, в силу ряда причин, некоторые из которых обсуждаются ниже. Следует отметить, что приведенный ниже список далеко не исчерпывающий. Выбор распределенной системы может быть мотивирован более чем одним из аргументов, приведенных ниже. Некоторые из преимуществ могут быть получены как полезный побочный эффект при выборе других причин. Характеристики распределенных систем могут также варьироваться в зависимости от причины их существования.
Обмен информацией.Необходимость обмена данными между различными узлами возросла в шестидесятых годах, когда большинство основных университетов и компаний начали пользоваться своими собственными майнфреймами. Взаимодействие между людьми из различных организаций облегчилось благодаря обмену данными между компьютерами этих организаций, и это дало рост развитию так называемых глобальных сетей ( WAN ). Компьютерная система, соединенная в глобальную сеть, обычно снабжалась всем, что необходимо пользователю: резервными хранилищами данных, дисками, многими прикладными программами и принтерами.
Позже компьютеры стали меньше и дешевле, и сегодня одна организация в большинстве случаев имеет множество компьютеров - часто один компьютер на одного работника (рабочую станцию). В этом случае также требуется, чтобы эти компьютеры были соединены для электронного обмена информацией между персоналом компании.
Разделение ресурсов.Хотя с приходом более дешевых компонентов вычислительной техники стало возможно снабжать каждого сотрудника организации личным компьютером, это не всегда возможно (или целесообразно) делать для других ресурсов (принтеры, резервные хранилища, блоки дисков и т.д.). В этом, меньшем масштабе каждый компьютер может использовать специализированные узлы - серверы, которые снабжают его данными и предоставляют доступ к специализированным ресурсам. Сеть, соединяющая компьютеры в масштабе предприятия, называется локальной вычислительной сетью ( LAN ).
Причины, по которым организация устанавливает сеть небольших компьютеров, а не майнфреймы, - снижение стоимости и расширяемость. Во-первых, меньшие компьютеры имеют лучше соотношение цена/производительность, чем большие компьютеры. Во-вторых, если мощности системы недостаточно, то сеть может быть расширена добавлением других машин (
Большая надежность благодаря репликации.Распределенные системы имеют потенциал надежности больший, чем монолитные системы, благодаря свойству их частичного выхода из строя. Это значит, что некоторые узлы системы могут выйти из строя, в то время как другие по-прежнему функционируют и могут взять на себя задачи испорченных компонентов. Выход из строя монолитного компьютера действует на всю систему целиком, и нет возможности продолжать вычисления в этом случае. По этой причине распределенные архитектуры представляют интерес при разработке высоконадежных компьютерных систем.
Высоконадежная система обычно состоит из нескольких репликационных унипроцессоров, которые исполняют прикладную программу и поддерживаются механизмом голосования, чтобы отфильтровывать результаты вычислений. Правильное функционирование распределенной системы при наличии поврежденных компонент требует довольно сложной алгоритмической поддержки.
Большая производительность благодаря распараллеливанию.Наличие многих процессоров в распределенной системе открывает возможность снижения дополнительного времени для интенсивной работы с помощью разделения работы среди нескольких процессоров.
Разделение для обеспечения параллельного выполнения часто применяется при построении вычислительных систем, предназначенных для решения сложных
Большая производительность благодаря балансировке нагрузки.Часто мотивом для создания распределенной системы служит задача увеличения Internet, когда запрос пользователя перенаправляется на веб-сервер, наименее загруженный в настоящий момент.
Упрощение разработки благодаря специализации.Разработка компьютерной системы может быть сложной, особенно если требуется значительная функциональность. Разработка может быть зачастую упрощена разбитием системы на модули, каждый из которых отвечает за часть функциональности и взаимодействует с другими модулями.
На уровне одной программы модульность достигается определением абстрактных типов данных и процедур для различных задач. Большая система может быть определена как набор кооперирующих процессов. В обоих случаях модули могут быть исполнены в рамках одного компьютера. Но также возможно иметь локальную сеть с различными типами компьютеров: один снабжен специальным оборудованием для вычислений, другой - графическим оборудованием, третий - дисками и т.д.
Интернет, видимо, является одной из самых известных в настоящее время распределенных систем. Эта же система является и самой богатой в том смысле, что в силу обширности в ней можно найти примеры для иллюстрации практически любого положения этого курса.
С самого начала эта сеть строилась как распределенная система, способная продолжать функционировать при уничтожении части (возможно - большой части) составляющих ее узлов. Как известно, технологии, которые лежат в основе Интернета, должны были обеспечить выживание военных сетей США в случае массированного ядерного удара со стороны СССР. В результате мы имеем технологию объединения независимых сетей с помощью единого
С одной стороны, Интернет является ярким примером системы, построенной по архитектуре (о ней речь пойдет ниже), - все узлы в нем независимы. С другой стороны, если мы поднимемся на уровень сервисов, то увидим примеры практически всех известных архитектур.
Интернет, кроме того что является самой известной распределенной системой, видимо, является и самой большой из них.
Другим примером распределенной системы может служить
Другим примером, возможно неожиданным, распределенной системы является и современный автомобиль, представляющий собой очень сложное с технической точки зрения устройство. Большинство современных автомобилей имеют на борту автономный компьютер, управляющий работой различных систем. Некоторые из этих систем (например, система управления впрыском топлива), в свою очередь, достаточно сложны и имеют собственный микропроцессор управления. Логика работы систем такого рода в некотором смысле напоминает логику работы нервной системы человека - высшие отделы головного мозга отдают приказы верхнего уровня, формируют стратегию, а тактикой, реализацией этой стратегии занимаются подкорка и спинной мозг.
К таким системам (их часто называют "встроенные системы") предъявляются очень высокие требования, поскольку от их функционирования зависит безопасность, а часто и жизнь людей.
Также примером распределенных систем могут служить кластеры. Под кластером обычно понимают несколько вычислительных узлов, объединенных с помощью некоторой быстрой технологии передачи данных и с установленным специальным программным обеспечением. Компьютерные кластеры в настоящее время получили большое распространение. Видимо, это связано, в первую очередь, с тем, что из-за постоянного снижения цен на оборудование и появление в последнее время соответствующего системного программного обеспечения технология создания кластеров стала общедоступной.
Задач, которые пытаются решать с применением технологии кластеризации, - две. Первая связана с резервированием некоторых критических сервисов. Для этого применяются кластеры, настроенные таким образом, что при сбое одного из узлов, входящих в кластер, сервисы, обслуживаемые этим узлом, автоматически загружаются на другом узле кластера. Такой подход позволяет существенно минимизировать время простоя системы, а для некоторых видов сервисов к тому же абсолютно прозрачен для клиентов. Кластеры, построенные по такому принципу, называются отказоустойчивыми кластерами.
Вторая задача, которую решают путем кластеризации, состоит в увеличении производительности системы. При таком подходе один сервис запускается на нескольких узлах кластера (реализация этого может быть различной - на каждом из узлов запускается копия сервиса, сервис запускается на одном узле, а часть его процедур размещается на других узлах и т.д.), при этом количество одновременно обрабатываемых заданий увеличивается (если не рассматривать тривиальные сервисы, то для обеспечения такой возможности сервис должен быть специальным образом спроектирован). Кластеры, решающие задачи такого вида, называются высокопроизводительными.
Как правило, требования, предъявляемые этими двумя задачами, настолько различны, что каждый конкретный кластер решает только одну из них.
Ниже перечислены некоторые требования, которым должны удовлетворять разрабатываемые программные системы. Большинство из них применимо, конечно, не только к распределенным системам, а вообще ко всем используемым и разрабатываемым системам, в том числе и монолитным. Однако, как и в других случаях, "распределенность" накладывает свой отпечаток: то, что для монолитных приложений может рассматриваться как желательная характеристика, для распределенных является обязательной.
Открытость
Использование
Безопасность
Безопасность - важное свойство любой программной системы и распределенной в частности. Под безопасностью обычно понимают совокупность следующих свойств:
Для распределенного приложения, которое часто пересылает данные по сети, важным частным случаем первого свойства (конфиденциальности) является способность к шифрованию передаваемых по сети сообщений.
Важной проблемой при проектировании распределенного приложения является задача обеспечения Quality of Service ). Под ) - она может возникнуть, если злоумышленник бомбардирует сервер запросами, которые тот не успевает обрабатывать.
Решение этой проблемы в общем виде может быть очень сложным, однако существуют рекомендации, позволяющие обходить ее в большинстве случаев. Другой важной проблемой безопасности является использование мобильного кода (кода, пришедшего по сети и исполняемого локально). Здесь решение состоит в применении интерпретируемого кода и виртуальных машин.
Масштабируемость
Масштабируемость - один из возможных плюсов, получаемых при реализации распределенной системы. Именно возможных, а не действительных, поскольку вполне можно представить себе географически распределенную систему, архитектура которой не допускает изменения числа входящих в нее узлов, или систему, производительность которой при такой операции падает. Однако создавать масштабируемые системы очень заманчиво. И сложно, к сожалению. При создании масштабируемых систем необходимо исследовать производительность начиная с самых ранних этапов проектирования и реализации системы. Требование масштабируемости должно быть включено в список формальных требований к функционалу системы. Необходимо тщательно контролировать утечки ресурсов, исследовать работу системы, находя и устраняя узкие места ("бутылочные горлышки"). Существуют эмпирические оценки того, как добиться масштабируемости системы - вот некоторые из них:
О(n), где n - количество пользователей;O(log(d)), где d - количество данных.Существуют, однако, ограничения, которые пагубно влияют на производительность. Это могут быть жесткие ограничения среды (например, пропускная способность сетевого интерфейса), кроме того, некоторые ресурсы просто не допускают масштабирования.
Обработка ошибок
Распределенные приложения используют какую-то среду для коммуникаций. Очень часто в качестве такой среды выступает сеть. К сожалению, это приводит к тому, что ошибки в распределенных приложениях возникают чаще (во-первых, потому что используется сеть - элемент достаточно ненадежный, во-вторых, потому что архитектура распределенного приложения существенно сложнее, чем монолитного). В связи с этим приложение должно каким-то образом эти ошибки обнаруживать (вообще говоря, это не всегда возможно сделать). После обнаружения ошибка должна быть маскирована, а система должна попытаться продолжить выполнение далее, для чего может потребоваться вернуться к состоянию до возникновения ошибки.
Параллельность
Написание программ, работающих в параллельной среде, - трудная задача. Проблемы параллелизма возникают всякий раз, когда несколько процессов или потоков вычислений предпринимают попытки манипуляции одними и теми же элементами данных. Восприятие множества параллельных операций затруднено, поскольку перечислить все возможные сценарии развития событий, способные привести к тем или иным неприятностям, крайне сложно. Более того, параллельные операции трудно тестировать. Модель транзакций позволяет избежать массы трудностей: если вы манипулируете данными внутри транзакции, будьте уверены, что ничего плохого с ними не случится. Однако это не значит, что проблемами управления параллельными заданиями можно полностью пренебречь, так как во многих случаях приходится иметь дело с данными,
Впрочем, трудности связаны не только с параллелизмом -
Многие из этих проблем имеют известные решения, поскольку возникли еще на заре развития отрасли. При написании распределенных программ необходимо использовать весь опыт, накопленный в данной области, - применение
Прозрачность
Под прозрачностью обычно понимают скрытие от пользователя гетерогенной природы системы и представление ее на верхнем уровне как единой системы. Выделяют восемь видов прозрачности:
Для распределенных систем наиболее важными являются прозрачность доступа и физического расположения, поскольку они имеют критическое значение для должного использования распределенных ресурсов.
Управляемость
Система используется только в том случае, если она управляема. Для распределенной системы задача управления может быть довольно сложной, поскольку для распределенного ресурса, видимо, не может быть назначено единой точки управления (в противном случае выход из строя узла, владеющего этой точкой, будет означать крах системы). Другая проблема состоит в том, что существуют системы, никому не принадлежащие (являющиеся совокупностью более мелких, частных систем - Internet ). Очевидно, задача управления должна решаться в каждом конкретном случае наиболее подходящим образом.
Несмотря на то, что распределенные приложения могут обладать рядом преимуществ по сравнению с монолитными, при их создании приходится сталкиваться с рядом существенных трудностей. Ниже приведен неполный список некоторых типичных проблем, возникающих при проектировании и реализации распределенного приложения.
Зависимость от выбранной архитектуры
Точно так же, как и при проектировании традиционного приложения, вопрос выбора структурных решений (шаблонов), лежащих в его основе, является ключевым, более того, он приобретает решающую значимость. В силу того, что компоненты распределенного приложения часто вынуждены взаимодействовать по сети (что на порядок медленнее обычного для монолитных приложений метода взаимодействия - локального вызова процедуры), неудачно выбранная структура интерфейсов или компоновка модулей системы может привести к катастрофическим последствиям для производительности. Кроме того, поскольку различные модули системы выполняются на независимых узлах и, следовательно, в рамках независимых процессов, более остро проявляются проблемы синхронизации доступа к ресурсам и все связанные с этим вопросы, такие как обеспечение транзакционности обработки, уровни изоляции транзакций и т.д.
Гетерогенная среда
Поскольку различные части распределенного программного комплекса могут выполняться на разных узлах системы, которые могут отличаться аппаратной, сетевой, программной архитектурой, это влечет за собой серьезные проблемы в программировании таких систем. Достаточно сказать, что даже представление такого фундаментального понятия, как тип данных, зависит от используемого языка программирования и от аппаратной архитектуры. Наилучшим выходом из этой ситуации может считаться либо использование принятых и поддерживаемых стандартов (таких как протокол TCP/IP для сетевого взаимодействия или POSIX для системных вызовов),
либо применение специальных промежуточных средств ( middleware ), маскирующих гетерогенность ( CORBA, Java RMI, . NET и т.д.). Интересным решением проблемы гетерогенности является использование виртуальных машин (например, jvm ), исполняющих некоторый независимый от используемой целевой системы код.
При этом могут быть созданы системы, работающие и взаимодействующие друг с другом на любых Sun, IBM и Microsoft - в настоящее время активно работают в этом направлении, говорит о том, что этот подход перспективен. Альтернативным методом ("метод грубой силы") является подход, при котором все модули системы компилируются под все платформы, на которых система будет использоваться (применяется в настоящее время очень часто).
Сложность развертывания
В отличие от монолитного приложения распределенное приложение должно быть разделено на модули развертывания. Дело в том, что различные части распределенного приложения будут выполняться на разных узлах, имеющих, возможно, различные характеристики (различную аппаратную, программную платформу и т.д.). На каждый узел должен быть корректно инсталлирован свой модуль. В случае если в процессе работы системы происходит миграция программных компонент между узлами, необходимо учитывать особенности гетерогенной среды.
Сложность отладки
Характерной особенностью распределенных систем является то, что состояние, в котором пребывает система, тоже является "распределенным" - для того чтобы его зафиксировать, необходимо собрать информацию с нескольких вычислительных узлов. Другой проблемой является воспроизводимость результатов выполнения - поскольку процессы, выполняющиеся на различных вычислительных узлах, могут выполняться с разной скоростью, отличающейся от запуска к запуску.
Все вышесказанное должно было убедить в том, что создание распределенной программной системы - гораздо более сложная задача, чем создание монолитной. Однако то, что подобные системы не только разрабатываются, но и успешно эксплуатируются уже довольно долго, говорит о том, что, по всей видимости, найдены какие-то рецепты борьбы с перечисленными ранее проблемами. Действительно, при решении любой сложной задачи имеет смысл посмотреть, как подобные задачи решались ранее.
При внимательном изучении крупных распределенных систем, действительно, можно заметить довольно много общего в их строении, что позволяет говорить о наличии различных архитектур построения распределенных систем, которые, по сути, представляют собой такие общие решения, или шаблоны, которые полезно знать и которые можно применять в подходящих для этого случаях. Кроме того, рассмотрение архитектур, где выполняются программные системы, позволяет их некоторым образом классифицировать по этому признаку. Поскольку с каждой архитектурой можно связать некоторые характерные особенности, которыми будут обладать все реализующие эту архитектуру программные комплексы, такая классификация может быть полезна при выборе архитектуры проектируемой системы.
В самом деле, зная требования к системе и отличительные черты различных архитектур построения, можно выбрать из них наиболее подходящую.
При начальном моделировании системы обращают внимание не только на разделение системы на части (декомпозиция), но и на взаимодействие этих частей (модулей), которые, возможно, будут выполняться на разных узлах. Выбор архитектуры в большинстве случаев порождает тот или иной способ декомпозиции задачи, а также, в большинстве случаев, и способы взаимодействия. Хорошо продуманная структура системы должна обеспечивать надежность, управляемость, гибкость и при этом позволять построить экономически эффективное решение.
При описании архитектуры функции отдельных компонент обычно не указывают. Важными являются размещение компонент (с учетом сетевой топологии, которая может иметь решающее значение при выборе той или иной архитектуры), способы распределения данных (и управления ими), распределение нагрузки между компонентами, а также способы взаимодействия.
Взаимодействие компонентов для распределенных систем является ключевым аспектом. Очень часто именно особенностями взаимодействия диктуется в конечном итоге выбор архитектуры системы. В самом деле, если говорить о реальной ситуации, то модули распределенной системы обычно вынуждены взаимодействовать через сеть (того или иного типа), для которой время передачи данных на несколько порядков больше, чем время обращения к данным в локальной памяти. Поэтому стремятся построить систему таким образом, чтобы минимизировать количество и объем сетевого взаимодействия, переносят наиболее активно взаимодействующие модули на узлы, связанные быстрыми каналами, и т.д.
Взаимодействие подразумевает участие как минимум двух сторон - вызывающей ("клиента") и вызываемой ("сервера"). Соответственно, первый модуль будет являться клиентом по отношению ко второму. Стоит отметить, что, вообще говоря, роли определяются только на момент конкретного взаимодействия - так, модуль, являющийся инициатором запроса ("клиентом") в один момент времени, может быть запрошен о чем-то другим модулем (и, таким образом, стать для него "сервером"
Как уже говорилось, архитектуру можно понимать как некий шаблон, некоторую общую идею декомпозиции и взаимодействия компонентов, решение, которое до этого много раз применялось. В каком-то смысле, это попытка компенсировать возрастающую сложность системы.
Другой способ преодоления сложности лежит в области уже рассматриваемой модели разделения разрабатываемых систем на слои. Идея состоит в том, что, поскольку многие из задач возникают перед разработчиками постоянно, нужно создать некоторый набор готовых программных решений, достаточно общих, чтобы ими можно было бы воспользоваться в широком ряде случаев. При использовании такой методики приложение рассматривается как верхний слой (см. табл. 1.1) - он использует функциональность нижележащего слоя, который часто называют промежуточным программным обеспечением ( middleware ).
| Приложения, сервисы |
Промежуточное программное обеспечение ( Middleware ) |
| ОС |
| Аппаратное обеспечение |
Два нижних слоя часто объединяют общим термином "платформа".
Middleware - промежуточное программное обеспечение между платформой и собственно компонентами распределенного приложения. Уровень этот, вообще говоря, обязательным не является, но его наличие крайне желательно. Его задача - скрыть (маскировать) гетерогенность платформы и обеспечить удобную модель программирования. В качестве примера такого рода программного обеспечения можно привести, например, следующие продукты:
CORBA (OMG) - разрабатываемая консорциумом OMG технология, позволяющая вызывать методы Java (Sun) - технология выполнения промежуточного байт-кода на виртуальной машине. Однажды откомпилированный байт-код может выполняться на любой платформе, для которой реализована JVM ( Java Virtual Machine ), без перекомпиляции;.NET (Microsoft) - технология, основанная на выполнении предварительно откомпилированных в промежуточный код компонентов. Такой компонент может выполняться на любой платформе, для которой реализована поддержка библиотеки времени исполнения . NET ;Remote Procedure Call (Sun), Java Remote Method Invocation (Sun);MPI, PVM и многие другие.Следует, однако, отметить, что многие из перечисленных средств представляют собой несколько больше, чем просто библиотеку процедур. Часто для того, чтобы использовать одно из этих средств, программа должна быть не только написана, но и спроектирована специальным образом. По сути, производители часто навязывают ту или иную модель архитектуры, поэтому выбор промежуточного программного обеспечения превращается в очень серьезное решение, поменять которое в процессе реализации проекта будет очень сложно (практически невозможно).
Многие современные средства промежуточного программного обеспечения ( middleware ) поддерживают множество полезных сервисов, таких как сервис именования, сервис безопасности, поддержка транзакций, поддержка долговременного хранения объектов, сервис уведомления о событиях и многие другие. Их использование может значительно ускорить разработку приложений, упростить их отладку и сопровождение. Кроме того, их применение может упростить последующую интеграцию с компонентами (или целыми системами) других разработчиков, поскольку эти сервисы часто используют для взаимодействия открытые стандарты.
Все файлы к данному курсу Вы можете скачать здесь.
Информационные технологии являются, пожалуй, одной из наиболее динамично развивающихся областей современной экономики. Все увеличивающаяся мощность современных вычислительных устройств и их миниатюризация приводят к тому, что они находят все большее применение во всех областях человеческой деятельности. Согласитесь, сложно представить себе современное общество, скажем, без трансконтинентальных перелетов, современных лекарственных препаратов, возможности прогнозирования погоды, телевидения и т.д. и т.п., не говоря уже о таких "мелочах", как глобальная сеть Internet или сотовая связь.
Информационные системы окружают нас повсюду, область их применения постоянно расширяется, а сами они становятся все более и более сложными. Некоторые системы вырастают и усложняются настолько, что приобретают глобальный характер, и от их правильного и надежного функционирования начинает зависеть деятельность десятков или даже сотен тысяч людей. В силу своей "глобальности" (нужно обеспечить доступ к системе из территориально разнесенных между собой точек), а также в силу ряда других причин такие системы часто имеют очень сложную архитектуру, предполагающую их функционирование в виде набора компонентов, каждый из которых выполняется на отдельном узле. Поскольку число таких систем постоянно возрастает, требования, предъявляемые к ним, достаточно серьезны,
сложность проектирования и разработки таких систем высока, а методы и средства, применяемые при реализации таких проектов, отличны от принятых при разработке "монолитных" систем - существует необходимость в специализированных курсах.
Следует отметить, что на распределенные системы и обработку
Далее, используя термин "распределенная система", мы будем подразумевать взаимосвязанный набор автономных компьютеров, процессов или процессоров. Компьютеры, процессы или процессоры будут упоминаться как узлы распределенной системы. Будучи определенными как автономные, узлы должны быть, по крайней мере, оборудованы своим собственным блоком управления. Таким образом, ) не подпадает под определение распределенной системы. Чтобы быть определенными как взаимосвязанные, узлы должны иметь возможность обмениваться информацией.
Так как процессы могут играть роль узлов системы, определение включает программные системы, построенные как набор взаимодействующих процессов, даже если они выполняются на одной аппаратной платформе. В большинстве случаев, однако, распределенная система будет, по крайней мере, содержать несколько процессоров, соединенных коммутирующей аппаратурой.
Более ограничивающие определения распределенных систем могут быть также найдены в литературе. Tanenbaum [1], например, называет систему распределенной, только если существуют автономные узлы, прозрачные для пользователей системы. Распределенная система в этом смысле ведет себя как виртуальная самостоятельная компьютерная система, но реализация этой прозрачности требует разработки замысловатых алгоритмов распределенного управления.
Не следует думать, что распределенные системы - изобретение последних лет.
Два-три десятилетия назад при построении информационных систем популярной была модель "хост-компьютер + терминалы", реализованная на базе мэйнфреймов (например, IBM-360/370 или их отечественных аналогов - компьютеров серии ЕС ЭВМ), либо на базе так называемых мини- ЭВМ (например, , также имевших отечественный аналог - СМ-4 ). Характерной особенностью такой системы была полная "неинтеллектуальность" терминалов, используемых в качестве рабочих мест, - их работой управлял все тот же хост-компьютер.
Этот подход обладал несомненными по тем временам достоинствами. Во первых, пользователи такой системы могли совместно использовать различные ресурсы хост-компьютера (оперативную память, процессор) и довольно дорогие для тех времен периферийные устройства (принтеры,
Начавшийся бурный рост индустрии персональных компьютеров поначалу мало что изменил в идеологии построения программных систем - по-прежнему в большинстве своем программы имели дело с локальными ресурсами. Правда, часть этих ресурсов была уже "псевдолокальной" - например, файлы на сетевом диске, однако, по-прежнему файл обрабатывался непосредственно самим узлом, при этом файл сначала передавался по сети (уже на этом этапе развития возникли сложности - проблемы блокировки ресурсов и предупреждения тупиков, проблемы поддержки логической целостности для вносимых изменений и т.д.). В какой-то момент стало очевидно, что традиционные подходы не работают. При увеличении объема перерабатываемых данных, а также по мере возрастания их стоимости стало очевидно, что доверять их обработку клиентским машинам нельзя - любая ошибка на них (а чем больше клиентов, тем больше вероятность ошибки) приводит либо к потере консистентности данных, либо к их блокировкам в процессе работы, а, стало быть, к снижению общей производительности системы.
Следующим ключевым шагом стало повсеместное распространение идеологии клиент-серверной обработки. Это были "двухролевые" системы: клиент нес ответственность за отображение пользовательского интерфейса и выполнение кода приложения, а роль сервера обычно поручалась СУБД. В применении к примеру с файлом переход к клиент-серверной архитектуре может быть проиллюстрирован следующим образом: вместо того, чтобы читать файл целиком и обрабатывать его, машина-клиент передает машине-серверу запрос, в котором указывает, каким образом файл должен быть обработан. Сервер запрос клиента обрабатывает и возвращает ему результат.
С появлением и дальнейшим усложнением подобных систем очевидную значимость приобрело понятие "программного слоя".
Концепция слоев (уровней, layers ) - одна из общеупотребительных моделей, используемых разработчиками программного обеспечения для разделения сложных систем на более простые части. В архитектурах компьютерных систем, например, различают слои кода на языке программирования, функций операционной системы, драйверов устройств, наборов инструкций центрального процессора и внутренней логики чипов. В среде сетевого взаимодействия протокол FTP работает на основе протокола TCP, который, в свою очередь, функционирует "поверх" протокола IP, расположенного "над" протоколом Ethernet.
При таком подходе выделяют верхний слой, описывающий систему в целом (в силу того, что на нем упущено большинство малозначимых деталей, он оказывается обозримым), под ним располагается более низкий слой, на котором делается описание (реализация) используемым верхним уровнем операций и т.д. Таким образом, если смотреть снизу вверх, то получается, что каждый нижележащий слой обеспечивает функциональность, которую использует вышележащий для обеспечения сервисов более высокого слоя.
Расчленение системы на слои предоставляет целый ряд преимуществ.
Схема расслоения обладает и определенными недостатками.
Однако самое трудное при использовании архитектурных слоев - это определение содержимого и границ ответственности каждого слоя.
Повсеместный переход на технологию "клиент-сервер" помог решить много старых проблем, но при этом создал много новых. Одной из основных трудностей было и остается определение границы между функционалом клиента и сервера. Часто решение о переносе части задач на сервер пагубно сказывается на общей производительности системы, и наоборот, перенос части нагрузки на клиента может привести к потере централизации.
По мере роста популярности систем "клиент/сервер" набирала силу и технология объектно-ориентированного программирования, которая предлагала перейти к системной архитектуре с тремя слоями: слой представления отводится пользовательскому интерфейсу, слой предметной области предназначен для описания основных функций приложения, необходимых для достижения поставленной перед ним цели, а третий слой представляет источник данных.
С появлением Web всем внезапно захотелось иметь системы "клиент/сервер", где в роли клиента выступал бы Web -браузер. Появившиеся инструментальные средства конструирования Web -страниц были в меньшей SQL и потому более подходили для реализации третьего уровня.
В настоящее время можно считать, что бум технологий, связанных с клиент-серверной архитектурой, все еще продолжается - большинство работающих в настоящее время информационных систем выполнено в этой технологии. Однако актуальными являются направления, связанные с развитием этой идеи - так называемые трехслойные и многослойные, а также децентрализованные приложения.
Зачастую предпочтительнее использовать распределенные системы, а не монолитные, или их использования бывает просто не избежать, в силу ряда причин, некоторые из которых обсуждаются ниже. Следует отметить, что приведенный ниже список далеко не исчерпывающий. Выбор распределенной системы может быть мотивирован более чем одним из аргументов, приведенных ниже. Некоторые из преимуществ могут быть получены как полезный побочный эффект при выборе других причин. Характеристики распределенных систем могут также варьироваться в зависимости от причины их существования.
Обмен информацией.Необходимость обмена данными между различными узлами возросла в шестидесятых годах, когда большинство основных университетов и компаний начали пользоваться своими собственными майнфреймами. Взаимодействие между людьми из различных организаций облегчилось благодаря обмену данными между компьютерами этих организаций, и это дало рост развитию так называемых глобальных сетей ( WAN ). Компьютерная система, соединенная в глобальную сеть, обычно снабжалась всем, что необходимо пользователю: резервными хранилищами данных, дисками, многими прикладными программами и принтерами.
Позже компьютеры стали меньше и дешевле, и сегодня одна организация в большинстве случаев имеет множество компьютеров - часто один компьютер на одного работника (рабочую станцию). В этом случае также требуется, чтобы эти компьютеры были соединены для электронного обмена информацией между персоналом компании.
Разделение ресурсов.Хотя с приходом более дешевых компонентов вычислительной техники стало возможно снабжать каждого сотрудника организации личным компьютером, это не всегда возможно (или целесообразно) делать для других ресурсов (принтеры, резервные хранилища, блоки дисков и т.д.). В этом, меньшем масштабе каждый компьютер может использовать специализированные узлы - серверы, которые снабжают его данными и предоставляют доступ к специализированным ресурсам. Сеть, соединяющая компьютеры в масштабе предприятия, называется локальной вычислительной сетью ( LAN ).
Причины, по которым организация устанавливает сеть небольших компьютеров, а не майнфреймы, - снижение стоимости и расширяемость. Во-первых, меньшие компьютеры имеют лучше соотношение цена/производительность, чем большие компьютеры. Во-вторых, если мощности системы недостаточно, то сеть может быть расширена добавлением других машин (
Большая надежность благодаря репликации.Распределенные системы имеют потенциал надежности больший, чем монолитные системы, благодаря свойству их частичного выхода из строя. Это значит, что некоторые узлы системы могут выйти из строя, в то время как другие по-прежнему функционируют и могут взять на себя задачи испорченных компонентов. Выход из строя монолитного компьютера действует на всю систему целиком, и нет возможности продолжать вычисления в этом случае. По этой причине распределенные архитектуры представляют интерес при разработке высоконадежных компьютерных систем.
Высоконадежная система обычно состоит из нескольких репликационных унипроцессоров, которые исполняют прикладную программу и поддерживаются механизмом голосования, чтобы отфильтровывать результаты вычислений. Правильное функционирование распределенной системы при наличии поврежденных компонент требует довольно сложной алгоритмической поддержки.
Большая производительность благодаря распараллеливанию.Наличие многих процессоров в распределенной системе открывает возможность снижения дополнительного времени для интенсивной работы с помощью разделения работы среди нескольких процессоров.
Разделение для обеспечения параллельного выполнения часто применяется при построении вычислительных систем, предназначенных для решения сложных
Большая производительность благодаря балансировке нагрузки.Часто мотивом для создания распределенной системы служит задача увеличения Internet, когда запрос пользователя перенаправляется на веб-сервер, наименее загруженный в настоящий момент.
Упрощение разработки благодаря специализации.Разработка компьютерной системы может быть сложной, особенно если требуется значительная функциональность. Разработка может быть зачастую упрощена разбитием системы на модули, каждый из которых отвечает за часть функциональности и взаимодействует с другими модулями.
На уровне одной программы модульность достигается определением абстрактных типов данных и процедур для различных задач. Большая система может быть определена как набор кооперирующих процессов. В обоих случаях модули могут быть исполнены в рамках одного компьютера. Но также возможно иметь локальную сеть с различными типами компьютеров: один снабжен специальным оборудованием для вычислений, другой - графическим оборудованием, третий - дисками и т.д.
Интернет, видимо, является одной из самых известных в настоящее время распределенных систем. Эта же система является и самой богатой в том смысле, что в силу обширности в ней можно найти примеры для иллюстрации практически любого положения этого курса.
С самого начала эта сеть строилась как распределенная система, способная продолжать функционировать при уничтожении части (возможно - большой части) составляющих ее узлов. Как известно, технологии, которые лежат в основе Интернета, должны были обеспечить выживание военных сетей США в случае массированного ядерного удара со стороны СССР. В результате мы имеем технологию объединения независимых сетей с помощью единого
С одной стороны, Интернет является ярким примером системы, построенной по архитектуре (о ней речь пойдет ниже), - все узлы в нем независимы. С другой стороны, если мы поднимемся на уровень сервисов, то увидим примеры практически всех известных архитектур.
Интернет, кроме того что является самой известной распределенной системой, видимо, является и самой большой из них.
Другим примером распределенной системы может служить
Другим примером, возможно неожиданным, распределенной системы является и современный автомобиль, представляющий собой очень сложное с технической точки зрения устройство. Большинство современных автомобилей имеют на борту автономный компьютер, управляющий работой различных систем. Некоторые из этих систем (например, система управления впрыском топлива), в свою очередь, достаточно сложны и имеют собственный микропроцессор управления. Логика работы систем такого рода в некотором смысле напоминает логику работы нервной системы человека - высшие отделы головного мозга отдают приказы верхнего уровня, формируют стратегию, а тактикой, реализацией этой стратегии занимаются подкорка и спинной мозг.
К таким системам (их часто называют "встроенные системы") предъявляются очень высокие требования, поскольку от их функционирования зависит безопасность, а часто и жизнь людей.
Также примером распределенных систем могут служить кластеры. Под кластером обычно понимают несколько вычислительных узлов, объединенных с помощью некоторой быстрой технологии передачи данных и с установленным специальным программным обеспечением. Компьютерные кластеры в настоящее время получили большое распространение. Видимо, это связано, в первую очередь, с тем, что из-за постоянного снижения цен на оборудование и появление в последнее время соответствующего системного программного обеспечения технология создания кластеров стала общедоступной.
Задач, которые пытаются решать с применением технологии кластеризации, - две. Первая связана с резервированием некоторых критических сервисов. Для этого применяются кластеры, настроенные таким образом, что при сбое одного из узлов, входящих в кластер, сервисы, обслуживаемые этим узлом, автоматически загружаются на другом узле кластера. Такой подход позволяет существенно минимизировать время простоя системы, а для некоторых видов сервисов к тому же абсолютно прозрачен для клиентов. Кластеры, построенные по такому принципу, называются отказоустойчивыми кластерами.
Вторая задача, которую решают путем кластеризации, состоит в увеличении производительности системы. При таком подходе один сервис запускается на нескольких узлах кластера (реализация этого может быть различной - на каждом из узлов запускается копия сервиса, сервис запускается на одном узле, а часть его процедур размещается на других узлах и т.д.), при этом количество одновременно обрабатываемых заданий увеличивается (если не рассматривать тривиальные сервисы, то для обеспечения такой возможности сервис должен быть специальным образом спроектирован). Кластеры, решающие задачи такого вида, называются высокопроизводительными.
Как правило, требования, предъявляемые этими двумя задачами, настолько различны, что каждый конкретный кластер решает только одну из них.
Ниже перечислены некоторые требования, которым должны удовлетворять разрабатываемые программные системы. Большинство из них применимо, конечно, не только к распределенным системам, а вообще ко всем используемым и разрабатываемым системам, в том числе и монолитным. Однако, как и в других случаях, "распределенность" накладывает свой отпечаток: то, что для монолитных приложений может рассматриваться как желательная характеристика, для распределенных является обязательной.
Открытость
Использование
Безопасность
Безопасность - важное свойство любой программной системы и распределенной в частности. Под безопасностью обычно понимают совокупность следующих свойств:
Для распределенного приложения, которое часто пересылает данные по сети, важным частным случаем первого свойства (конфиденциальности) является способность к шифрованию передаваемых по сети сообщений.
Важной проблемой при проектировании распределенного приложения является задача обеспечения Quality of Service ). Под ) - она может возникнуть, если злоумышленник бомбардирует сервер запросами, которые тот не успевает обрабатывать.
Решение этой проблемы в общем виде может быть очень сложным, однако существуют рекомендации, позволяющие обходить ее в большинстве случаев. Другой важной проблемой безопасности является использование мобильного кода (кода, пришедшего по сети и исполняемого локально). Здесь решение состоит в применении интерпретируемого кода и виртуальных машин.
Масштабируемость
Масштабируемость - один из возможных плюсов, получаемых при реализации распределенной системы. Именно возможных, а не действительных, поскольку вполне можно представить себе географически распределенную систему, архитектура которой не допускает изменения числа входящих в нее узлов, или систему, производительность которой при такой операции падает. Однако создавать масштабируемые системы очень заманчиво. И сложно, к сожалению. При создании масштабируемых систем необходимо исследовать производительность начиная с самых ранних этапов проектирования и реализации системы. Требование масштабируемости должно быть включено в список формальных требований к функционалу системы. Необходимо тщательно контролировать утечки ресурсов, исследовать работу системы, находя и устраняя узкие места ("бутылочные горлышки"). Существуют эмпирические оценки того, как добиться масштабируемости системы - вот некоторые из них:
О(n), где n - количество пользователей;O(log(d)), где d - количество данных.Существуют, однако, ограничения, которые пагубно влияют на производительность. Это могут быть жесткие ограничения среды (например, пропускная способность сетевого интерфейса), кроме того, некоторые ресурсы просто не допускают масштабирования.
Обработка ошибок
Распределенные приложения используют какую-то среду для коммуникаций. Очень часто в качестве такой среды выступает сеть. К сожалению, это приводит к тому, что ошибки в распределенных приложениях возникают чаще (во-первых, потому что используется сеть - элемент достаточно ненадежный, во-вторых, потому что архитектура распределенного приложения существенно сложнее, чем монолитного). В связи с этим приложение должно каким-то образом эти ошибки обнаруживать (вообще говоря, это не всегда возможно сделать). После обнаружения ошибка должна быть маскирована, а система должна попытаться продолжить выполнение далее, для чего может потребоваться вернуться к состоянию до возникновения ошибки.
Параллельность
Написание программ, работающих в параллельной среде, - трудная задача. Проблемы параллелизма возникают всякий раз, когда несколько процессов или потоков вычислений предпринимают попытки манипуляции одними и теми же элементами данных. Восприятие множества параллельных операций затруднено, поскольку перечислить все возможные сценарии развития событий, способные привести к тем или иным неприятностям, крайне сложно. Более того, параллельные операции трудно тестировать. Модель транзакций позволяет избежать массы трудностей: если вы манипулируете данными внутри транзакции, будьте уверены, что ничего плохого с ними не случится. Однако это не значит, что проблемами управления параллельными заданиями можно полностью пренебречь, так как во многих случаях приходится иметь дело с данными,
Впрочем, трудности связаны не только с параллелизмом -
Многие из этих проблем имеют известные решения, поскольку возникли еще на заре развития отрасли. При написании распределенных программ необходимо использовать весь опыт, накопленный в данной области, - применение
Прозрачность
Под прозрачностью обычно понимают скрытие от пользователя гетерогенной природы системы и представление ее на верхнем уровне как единой системы. Выделяют восемь видов прозрачности:
Для распределенных систем наиболее важными являются прозрачность доступа и физического расположения, поскольку они имеют критическое значение для должного использования распределенных ресурсов.
Управляемость
Система используется только в том случае, если она управляема. Для распределенной системы задача управления может быть довольно сложной, поскольку для распределенного ресурса, видимо, не может быть назначено единой точки управления (в противном случае выход из строя узла, владеющего этой точкой, будет означать крах системы). Другая проблема состоит в том, что существуют системы, никому не принадлежащие (являющиеся совокупностью более мелких, частных систем - Internet ). Очевидно, задача управления должна решаться в каждом конкретном случае наиболее подходящим образом.
Несмотря на то, что распределенные приложения могут обладать рядом преимуществ по сравнению с монолитными, при их создании приходится сталкиваться с рядом существенных трудностей. Ниже приведен неполный список некоторых типичных проблем, возникающих при проектировании и реализации распределенного приложения.
Зависимость от выбранной архитектуры
Точно так же, как и при проектировании традиционного приложения, вопрос выбора структурных решений (шаблонов), лежащих в его основе, является ключевым, более того, он приобретает решающую значимость. В силу того, что компоненты распределенного приложения часто вынуждены взаимодействовать по сети (что на порядок медленнее обычного для монолитных приложений метода взаимодействия - локального вызова процедуры), неудачно выбранная структура интерфейсов или компоновка модулей системы может привести к катастрофическим последствиям для производительности. Кроме того, поскольку различные модули системы выполняются на независимых узлах и, следовательно, в рамках независимых процессов, более остро проявляются проблемы синхронизации доступа к ресурсам и все связанные с этим вопросы, такие как обеспечение транзакционности обработки, уровни изоляции транзакций и т.д.
Гетерогенная среда
Поскольку различные части распределенного программного комплекса могут выполняться на разных узлах системы, которые могут отличаться аппаратной, сетевой, программной архитектурой, это влечет за собой серьезные проблемы в программировании таких систем. Достаточно сказать, что даже представление такого фундаментального понятия, как тип данных, зависит от используемого языка программирования и от аппаратной архитектуры. Наилучшим выходом из этой ситуации может считаться либо использование принятых и поддерживаемых стандартов (таких как протокол TCP/IP для сетевого взаимодействия или POSIX для системных вызовов),
либо применение специальных промежуточных средств ( middleware ), маскирующих гетерогенность ( CORBA, Java RMI, . NET и т.д.). Интересным решением проблемы гетерогенности является использование виртуальных машин (например, jvm ), исполняющих некоторый независимый от используемой целевой системы код.
При этом могут быть созданы системы, работающие и взаимодействующие друг с другом на любых Sun, IBM и Microsoft - в настоящее время активно работают в этом направлении, говорит о том, что этот подход перспективен. Альтернативным методом ("метод грубой силы") является подход, при котором все модули системы компилируются под все платформы, на которых система будет использоваться (применяется в настоящее время очень часто).
Сложность развертывания
В отличие от монолитного приложения распределенное приложение должно быть разделено на модули развертывания. Дело в том, что различные части распределенного приложения будут выполняться на разных узлах, имеющих, возможно, различные характеристики (различную аппаратную, программную платформу и т.д.). На каждый узел должен быть корректно инсталлирован свой модуль. В случае если в процессе работы системы происходит миграция программных компонент между узлами, необходимо учитывать особенности гетерогенной среды.
Сложность отладки
Характерной особенностью распределенных систем является то, что состояние, в котором пребывает система, тоже является "распределенным" - для того чтобы его зафиксировать, необходимо собрать информацию с нескольких вычислительных узлов. Другой проблемой является воспроизводимость результатов выполнения - поскольку процессы, выполняющиеся на различных вычислительных узлах, могут выполняться с разной скоростью, отличающейся от запуска к запуску.
Все вышесказанное должно было убедить в том, что создание распределенной программной системы - гораздо более сложная задача, чем создание монолитной. Однако то, что подобные системы не только разрабатываются, но и успешно эксплуатируются уже довольно долго, говорит о том, что, по всей видимости, найдены какие-то рецепты борьбы с перечисленными ранее проблемами. Действительно, при решении любой сложной задачи имеет смысл посмотреть, как подобные задачи решались ранее.
При внимательном изучении крупных распределенных систем, действительно, можно заметить довольно много общего в их строении, что позволяет говорить о наличии различных архитектур построения распределенных систем, которые, по сути, представляют собой такие общие решения, или шаблоны, которые полезно знать и которые можно применять в подходящих для этого случаях. Кроме того, рассмотрение архитектур, где выполняются программные системы, позволяет их некоторым образом классифицировать по этому признаку. Поскольку с каждой архитектурой можно связать некоторые характерные особенности, которыми будут обладать все реализующие эту архитектуру программные комплексы, такая классификация может быть полезна при выборе архитектуры проектируемой системы.
В самом деле, зная требования к системе и отличительные черты различных архитектур построения, можно выбрать из них наиболее подходящую.
При начальном моделировании системы обращают внимание не только на разделение системы на части (декомпозиция), но и на взаимодействие этих частей (модулей), которые, возможно, будут выполняться на разных узлах. Выбор архитектуры в большинстве случаев порождает тот или иной способ декомпозиции задачи, а также, в большинстве случаев, и способы взаимодействия. Хорошо продуманная структура системы должна обеспечивать надежность, управляемость, гибкость и при этом позволять построить экономически эффективное решение.
При описании архитектуры функции отдельных компонент обычно не указывают. Важными являются размещение компонент (с учетом сетевой топологии, которая может иметь решающее значение при выборе той или иной архитектуры), способы распределения данных (и управления ими), распределение нагрузки между компонентами, а также способы взаимодействия.
Взаимодействие компонентов для распределенных систем является ключевым аспектом. Очень часто именно особенностями взаимодействия диктуется в конечном итоге выбор архитектуры системы. В самом деле, если говорить о реальной ситуации, то модули распределенной системы обычно вынуждены взаимодействовать через сеть (того или иного типа), для которой время передачи данных на несколько порядков больше, чем время обращения к данным в локальной памяти. Поэтому стремятся построить систему таким образом, чтобы минимизировать количество и объем сетевого взаимодействия, переносят наиболее активно взаимодействующие модули на узлы, связанные быстрыми каналами, и т.д.
Взаимодействие подразумевает участие как минимум двух сторон - вызывающей ("клиента") и вызываемой ("сервера"). Соответственно, первый модуль будет являться клиентом по отношению ко второму. Стоит отметить, что, вообще говоря, роли определяются только на момент конкретного взаимодействия - так, модуль, являющийся инициатором запроса ("клиентом") в один момент времени, может быть запрошен о чем-то другим модулем (и, таким образом, стать для него "сервером"
Как уже говорилось, архитектуру можно понимать как некий шаблон, некоторую общую идею декомпозиции и взаимодействия компонентов, решение, которое до этого много раз применялось. В каком-то смысле, это попытка компенсировать возрастающую сложность системы.
Другой способ преодоления сложности лежит в области уже рассматриваемой модели разделения разрабатываемых систем на слои. Идея состоит в том, что, поскольку многие из задач возникают перед разработчиками постоянно, нужно создать некоторый набор готовых программных решений, достаточно общих, чтобы ими можно было бы воспользоваться в широком ряде случаев. При использовании такой методики приложение рассматривается как верхний слой (см. табл. 1.1) - он использует функциональность нижележащего слоя, который часто называют промежуточным программным обеспечением ( middleware ).
| Приложения, сервисы |
Промежуточное программное обеспечение ( Middleware ) |
| ОС |
| Аппаратное обеспечение |
Два нижних слоя часто объединяют общим термином "платформа".
Middleware - промежуточное программное обеспечение между платформой и собственно компонентами распределенного приложения. Уровень этот, вообще говоря, обязательным не является, но его наличие крайне желательно. Его задача - скрыть (маскировать) гетерогенность платформы и обеспечить удобную модель программирования. В качестве примера такого рода программного обеспечения можно привести, например, следующие продукты:
CORBA (OMG) - разрабатываемая консорциумом OMG технология, позволяющая вызывать методы Java (Sun) - технология выполнения промежуточного байт-кода на виртуальной машине. Однажды откомпилированный байт-код может выполняться на любой платформе, для которой реализована JVM ( Java Virtual Machine ), без перекомпиляции;.NET (Microsoft) - технология, основанная на выполнении предварительно откомпилированных в промежуточный код компонентов. Такой компонент может выполняться на любой платформе, для которой реализована поддержка библиотеки времени исполнения . NET ;Remote Procedure Call (Sun), Java Remote Method Invocation (Sun);MPI, PVM и многие другие.Следует, однако, отметить, что многие из перечисленных средств представляют собой несколько больше, чем просто библиотеку процедур. Часто для того, чтобы использовать одно из этих средств, программа должна быть не только написана, но и спроектирована специальным образом. По сути, производители часто навязывают ту или иную модель архитектуры, поэтому выбор промежуточного программного обеспечения превращается в очень серьезное решение, поменять которое в процессе реализации проекта будет очень сложно (практически невозможно).
Многие современные средства промежуточного программного обеспечения ( middleware ) поддерживают множество полезных сервисов, таких как сервис именования, сервис безопасности, поддержка транзакций, поддержка долговременного хранения объектов, сервис уведомления о событиях и многие другие. Их использование может значительно ускорить разработку приложений, упростить их отладку и сопровождение. Кроме того, их применение может упростить последующую интеграцию с компонентами (или целыми системами) других разработчиков, поскольку эти сервисы часто используют для взаимодействия открытые стандарты.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.