Построение распределенных систем на Java
Покупка
Новинка
Тематика:
Программирование на Java
Издательство:
ИНТУИТ
Автор:
Свистунов Алексей Николаевич
Год издания: 2016
Кол-во страниц: 238
Дополнительно
В этом курсе рассказывается о проблемах, cопровождающих разработку распределенных программных систем, и методах решения этих проблем. Все рассмотренные элементы технологии проиллюстрированы примерами, ознакомившись с которыми, читатели получат полное
представление о методах разработки распределенных приложений на платформе J2EE.
В рамках курса рассматривается ряд популярных способов разработки распределенных приложений с использованием технологии Java (API java.net, RMI, CORBA, Web-сервисы, JMS). Все рассматриваемые технологии и программные средства либо входят в стандартный комплект поставки J2SE, либо могут быть свободно загружены с сайтов компаний-разработчиков.
Тематика:
ББК:
УДК:
ОКСО:
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
Построение распределенных систем на Java 2-е издание, исправленное Свистунов А.Н. Национальный Открытый Университет “ИНТУИТ” 2016 2
Построение распределенных систем на Java/ А.Н. Свистунов - М.: Национальный Открытый Университет “ИНТУИТ”, 2016 В этом курсе рассказывается о проблемах, cопровождающих разработку распределенных программных систем, и методах решения этих проблем. Все рассмотренные элементы технологии проиллюстрированы примерами, ознакомившись с которыми, читатели получат полное представление о методах разработки распределенных приложений на платформе J2EE. В рамках курса рассматривается ряд популярных способов разработки распределенных приложений с использованием технологии Java (API java.net, RMI, CORBA, Web-сервисы, JMS). Все рассматриваемые технологии и программные средства либо входят в стандартный комплект поставки J2SE, либо могут быть свободно загружены с сайтов компаний-разработчиков. (c) ООО “ИНТУИТ.РУ”, 2010-2016 (c) Свистунов А.Н., 2010-2016 3
Введение В лекции рассматриваются вопросы мотивации создания распределенных программных систем, дается представление о различных типах и способах их построения, приводятся примеры Все файлы к данному курсу Вы можете скачать здесь скачать: http://old.intuit.ru/department/pl/distrsysjava/1/Practice.zip. Информационные технологии являются, пожалуй, одной из наиболее динамично развивающихся областей современной экономики. Все увеличивающаяся мощность современных вычислительных устройств и их миниатюризация приводят к тому, что они находят все большее применение во всех областях человеческой деятельности. Согласитесь, сложно представить себе современное общество, скажем, без трансконтинентальных перелетов, современных лекарственных препаратов, возможности прогнозирования погоды, телевидения и т.д. и т.п., не говоря уже о таких “мелочах”, как глобальная сеть Internet или сотовая связь. Информационные системы окружают нас повсюду, область их применения постоянно расширяется, а сами они становятся все более и более сложными. Некоторые системы вырастают и усложняются настолько, что приобретают глобальный характер, и от их правильного и надежного функционирования начинает зависеть деятельность десятков или даже сотен тысяч людей. В силу своей “глобальности” (нужно обеспечить доступ к системе из территориально разнесенных между собой точек), а также в силу ряда других причин такие системы часто имеют очень сложную архитектуру, предполагающую их функционирование в виде набора компонентов, каждый из которых выполняется на отдельном узле. Поскольку число таких систем постоянно возрастает, требования, предъявляемые к ним, достаточно серьезны, сложность проектирования и разработки таких систем высока, а методы и средства, применяемые при реализации таких проектов, отличны от принятых при разработке “монолитных” систем - существует необходимость в специализированных курсах. Следует отметить, что на распределенные системы и обработку распределенной информации направлено значительное внимание в последние несколько лет, и почти каждый университет предлагает по крайней мере один курс по разработке распределенных алгоритмов. Существует большое число книг о принципах построения распределенных систем, в том числе считающийся классическим учебник [1]. Далее, используя термин “распределенная система”, мы будем подразумевать взаимосвязанный набор автономных компьютеров, процессов или процессоров. Компьютеры, процессы или процессоры будут упоминаться как узлы распределенной системы. Будучи определенными как автономные, узлы должны быть, по крайней мере, оборудованы своим собственным блоком управления. Таким образом, параллельный компьютер с одним потоком управления и несколькими потоками данных ( SIMD ) не подпадает под определение распределенной системы. Чтобы быть определенными как взаимосвязанные, узлы должны иметь возможность обмениваться информацией. Так как процессы могут играть роль узлов системы, определение включает 4
программные системы, построенные как набор взаимодействующих процессов, даже если они выполняются на одной аппаратной платформе. В большинстве случаев, однако, распределенная система будет, по крайней мере, содержать несколько процессоров, соединенных коммутирующей аппаратурой. Более ограничивающие определения распределенных систем могут быть также найдены в литературе. Tanenbaum [1], например, называет систему распределенной, только если существуют автономные узлы, прозрачные для пользователей системы. Распределенная система в этом смысле ведет себя как виртуальная самостоятельная компьютерная система, но реализация этой прозрачности требует разработки замысловатых алгоритмов распределенного управления. Экскурс в историю Не следует думать, что распределенные системы - изобретение последних лет. Два-три десятилетия назад при построении информационных систем популярной была модель “хост-компьютер + терминалы”, реализованная на базе мэйнфреймов (например, IBM-360/370 или их отечественных аналогов - компьютеров серии ЕС ЭВМ), либо на базе так называемых мини- ЭВМ (например, PDP-11, также имевших отечественный аналог - СМ-4 ). Характерной особенностью такой системы была полная “неинтеллектуальность” терминалов, используемых в качестве рабочих мест, - их работой управлял все тот же хост-компьютер. Этот подход обладал несомненными по тем временам достоинствами. Во первых, пользователи такой системы могли совместно использовать различные ресурсы хосткомпьютера (оперативную память, процессор) и довольно дорогие для тех времен периферийные устройства (принтеры, графопостроители, устройства ввода с магнитных лент и гибких дисков, дисковые накопители). Задействованное программное обеспечение в таком случае имело дело только с “локальными” ресурсами - с локальной файловой системой, локальной оперативной памятью и т.д. Начавшийся бурный рост индустрии персональных компьютеров поначалу мало что изменил в идеологии построения программных систем - по-прежнему в большинстве своем программы имели дело с локальными ресурсами. Правда, часть этих ресурсов была уже “псевдолокальной” - например, файлы на сетевом диске, однако, попрежнему файл обрабатывался непосредственно самим узлом, при этом файл сначала передавался по сети (уже на этом этапе развития возникли сложности - проблемы блокировки ресурсов и предупреждения тупиков, проблемы поддержки логической целостности для вносимых изменений и т.д.). В какой-то момент стало очевидно, что традиционные подходы не работают. При увеличении объема перерабатываемых данных, а также по мере возрастания их стоимости стало очевидно, что доверять их обработку клиентским машинам нельзя - любая ошибка на них (а чем больше клиентов, тем больше вероятность ошибки) приводит либо к потере консистентности данных, либо к их блокировкам в процессе работы, а, стало быть, к снижению общей производительности системы. 5
Следующим ключевым шагом стало повсеместное распространение идеологии клиентсерверной обработки. Это были “двухролевые” системы: клиент нес ответственность за отображение пользовательского интерфейса и выполнение кода приложения, а роль сервера обычно поручалась СУБД. В применении к примеру с файлом переход к клиентсерверной архитектуре может быть проиллюстрирован следующим образом: вместо того, чтобы читать файл целиком и обрабатывать его, машина-клиент передает машине-серверу запрос, в котором указывает, каким образом файл должен быть обработан. Сервер запрос клиента обрабатывает и возвращает ему результат. С появлением и дальнейшим усложнением подобных систем очевидную значимость приобрело понятие “программного слоя”. Концепция слоев (уровней, layers ) - одна из общеупотребительных моделей, используемых разработчиками программного обеспечения для разделения сложных систем на более простые части. В архитектурах компьютерных систем, например, различают слои кода на языке программирования, функций операционной системы, драйверов устройств, наборов инструкций центрального процессора и внутренней логики чипов. В среде сетевого взаимодействия протокол FTP работает на основе протокола TCP, который, в свою очередь, функционирует “поверх” протокола IP, расположенного “над” протоколом Ethernet. При таком подходе выделяют верхний слой, описывающий систему в целом (в силу того, что на нем упущено большинство малозначимых деталей, он оказывается обозримым), под ним располагается более низкий слой, на котором делается описание (реализация) используемым верхним уровнем операций и т.д. Таким образом, если смотреть снизу вверх, то получается, что каждый нижележащий слой обеспечивает функциональность, которую использует вышележащий для обеспечения сервисов более высокого слоя. Расчленение системы на слои предоставляет целый ряд преимуществ. Отдельный слой можно воспринимать как единое самодостаточное целое, не особенно заботясь о наличии других слоев. Можно выбирать альтернативную реализацию базовых слоев. Зависимость между слоями можно свести к минимуму. Каждый слой является удачным кандидатом на стандартизацию. Созданный слой может служить основой для нескольких различных слоев более высокого уровня. В противном случае для каждого протокола высокого уровня пришлось бы изобретать собственный протокол низкого уровня. Схема расслоения обладает и определенными недостатками. Слои способны удачно инкапсулировать многое, но не все: модификация одного слоя подчас связана с необходимостью внесения каскадных изменений в остальные слои. Наличие избыточных слоев нередко снижает производительность системы. При переходе от слоя к слою моделируемые сущности обычно подвергаются 6
преобразованиям из одного представления в другое. Несмотря на это, инкапсуляция нижележащих функций зачастую позволяет достичь весьма существенного преимущества. Однако самое трудное при использовании архитектурных слоев - это определение содержимого и границ ответственности каждого слоя. Повсеместный переход на технологию “клиент-сервер” помог решить много старых проблем, но при этом создал много новых. Одной из основных трудностей было и остается определение границы между функционалом клиента и сервера. Часто решение о переносе части задач на сервер пагубно сказывается на общей производительности системы, и наоборот, перенос части нагрузки на клиента может привести к потере централизации. По мере роста популярности систем “клиент/сервер” набирала силу и технология объектно-ориентированного программирования, которая предлагала перейти к системной архитектуре с тремя слоями: слой представления отводится пользовательскому интерфейсу, слой предметной области предназначен для описания основных функций приложения, необходимых для достижения поставленной перед ним цели, а третий слой представляет источник данных. С появлением Web всем внезапно захотелось иметь системы “клиент/сервер”, где в роли клиента выступал бы Web -браузер. Появившиеся инструментальные средства конструирования Web -страниц были в меньшей степени связаны с SQL и потому более подходили для реализации третьего уровня. В настоящее время можно считать, что бум технологий, связанных с клиент-серверной архитектурой, все еще продолжается - большинство работающих в настоящее время информационных систем выполнено в этой технологии. Однако актуальными являются направления, связанные с развитием этой идеи - так называемые трехслойные и многослойные, а также децентрализованные приложения. Мотивация Зачастую предпочтительнее использовать распределенные системы, а не монолитные, или их использования бывает просто не избежать, в силу ряда причин, некоторые из которых обсуждаются ниже. Следует отметить, что приведенный ниже список далеко не исчерпывающий. Выбор распределенной системы может быть мотивирован более чем одним из аргументов, приведенных ниже. Некоторые из преимуществ могут быть получены как полезный побочный эффект при выборе других причин. Характеристики распределенных систем могут также варьироваться в зависимости от причины их существования. Обмен информацией.Необходимость обмена данными между различными узлами возросла в шестидесятых годах, когда большинство основных университетов и компаний начали пользоваться своими собственными майнфреймами. Взаимодействие между людьми из различных организаций облегчилось благодаря обмену данными 7
между компьютерами этих организаций, и это дало рост развитию так называемых глобальных сетей ( WAN ). Компьютерная система, соединенная в глобальную сеть, обычно снабжалась всем, что необходимо пользователю: резервными хранилищами данных, дисками, многими прикладными программами и принтерами. Позже компьютеры стали меньше и дешевле, и сегодня одна организация в большинстве случаев имеет множество компьютеров - часто один компьютер на одного работника (рабочую станцию). В этом случае также требуется, чтобы эти компьютеры были соединены для электронного обмена информацией между персоналом компании. Разделение ресурсов.Хотя с приходом более дешевых компонентов вычислительной техники стало возможно снабжать каждого сотрудника организации личным компьютером, это не всегда возможно (или целесообразно) делать для других ресурсов (принтеры, резервные хранилища, блоки дисков и т.д.). В этом, меньшем масштабе каждый компьютер может использовать специализированные узлы - серверы, которые снабжают его данными и предоставляют доступ к специализированным ресурсам. Сеть, соединяющая компьютеры в масштабе предприятия, называется локальной вычислительной сетью ( LAN ). Причины, по которым организация устанавливает сеть небольших компьютеров, а не майнфреймы, - снижение стоимости и расширяемость. Во-первых, меньшие компьютеры имеют лучше соотношение цена/производительность, чем большие компьютеры. Во-вторых, если мощности системы недостаточно, то сеть может быть расширена добавлением других машин (файловых серверов, принтеров и рабочих станций). Если же мощность монолитной системы неудовлетворительна, остается только полная замена. Большая надежность благодаря репликации.Распределенные системы имеют потенциал надежности больший, чем монолитные системы, благодаря свойству их частичного выхода из строя. Это значит, что некоторые узлы системы могут выйти из строя, в то время как другие по-прежнему функционируют и могут взять на себя задачи испорченных компонентов. Выход из строя монолитного компьютера действует на всю систему целиком, и нет возможности продолжать вычисления в этом случае. По этой причине распределенные архитектуры представляют интерес при разработке высоконадежных компьютерных систем. Высоконадежная система обычно состоит из нескольких репликационных унипроцессоров, которые исполняют прикладную программу и поддерживаются механизмом голосования, чтобы отфильтровывать результаты вычислений. Правильное функционирование распределенной системы при наличии поврежденных компонент требует довольно сложной алгоритмической поддержки. Большая производительность благодаря распараллеливанию.Наличие многих процессоров в распределенной системе открывает возможность снижения дополнительного времени для интенсивной работы с помощью разделения работы среди нескольких процессоров. 8
Разделение для обеспечения параллельного выполнения часто применяется при построении вычислительных систем, предназначенных для решения сложных вычислительных задач. Цель такой распределенной системы - уменьшение времени выполнения задачи. Большая производительность благодаря балансировке нагрузки.Часто мотивом для создания распределенной системы служит задача увеличения общей пропускной способности системы путем балансировки нагрузки составляющих ее узлов. При этом подходе задача (целиком!!!) попадает на наименее загруженную часть (узел) системы. В качестве примера можно привести одну из систем поиска в Internet, когда запрос пользователя перенаправляется на веб-сервер, наименее загруженный в настоящий момент. Упрощение разработки благодаря специализации.Разработка компьютерной системы может быть сложной, особенно если требуется значительная функциональность. Разработка может быть зачастую упрощена разбитием системы на модули, каждый из которых отвечает за часть функциональности и взаимодействует с другими модулями. На уровне одной программы модульность достигается определением абстрактных типов данных и процедур для различных задач. Большая система может быть определена как набор кооперирующих процессов. В обоих случаях модули могут быть исполнены в рамках одного компьютера. Но также возможно иметь локальную сеть с различными типами компьютеров: один снабжен специальным оборудованием для вычислений, другой - графическим оборудованием, третий - дисками и т.д. Примеры распределенных систем Интернет, видимо, является одной из самых известных в настоящее время распределенных систем. Эта же система является и самой богатой в том смысле, что в силу обширности в ней можно найти примеры для иллюстрации практически любого положения этого курса. С самого начала эта сеть строилась как распределенная система, способная продолжать функционировать при уничтожении части (возможно - большой части) составляющих ее узлов. Как известно, технологии, которые лежат в основе Интернета, должны были обеспечить выживание военных сетей США в случае массированного ядерного удара со стороны СССР. В результате мы имеем технологию объединения независимых сетей с помощью единого коммуникационного протокола, позволяющего динамически перенастраивать маршруты передачи пакетов данных. С одной стороны, Интернет является ярким примером системы, построенной по архитектуре P2P (о ней речь пойдет ниже), - все узлы в нем независимы. С другой стороны, если мы поднимемся на уровень сервисов, то увидим примеры практически всех известных архитектур. Интернет, кроме того что является самой известной распределенной системой, видимо, является и самой большой из них. 9
Другим примером распределенной системы может служить интранет. Под интранетом обычно понимают сообщество сетей, объединенных по какому-либо признаку (сети крупного предприятия, например). В интранете представлены узлы, доступ к которым необходим для его пользователей. Это узлы, предоставляющие определенные сервисы, - серверы печати, серверы баз данных, файл-серверы, почтовые серверы, серверы приложений и т.д. Создание подобных сетей диктуется двумя основными потребностями - потребностью в обмене той или иной информацией и потребностью в обеспечении совместного доступа к “дорогим” разделяемым ресурсам (принтеры и другое разделяемое оборудование, доступ в Интернет, доступ к корпоративным данным и т.д.). Интранет часто называют “Интернетом в малом”. Основанный часто на тех же технологиях, что и “большой” Интернет, он обладает большей защищенностью, поскольку может быть централизованно управляем. Другим примером, возможно неожиданным, распределенной системы является и современный автомобиль, представляющий собой очень сложное с технической точки зрения устройство. Большинство современных автомобилей имеют на борту автономный компьютер, управляющий работой различных систем. Некоторые из этих систем (например, система управления впрыском топлива), в свою очередь, достаточно сложны и имеют собственный микропроцессор управления. Логика работы систем такого рода в некотором смысле напоминает логику работы нервной системы человека - высшие отделы головного мозга отдают приказы верхнего уровня, формируют стратегию, а тактикой, реализацией этой стратегии занимаются подкорка и спинной мозг. К таким системам (их часто называют “встроенные системы”) предъявляются очень высокие требования, поскольку от их функционирования зависит безопасность, а часто и жизнь людей. Также примером распределенных систем могут служить кластеры. Под кластером обычно понимают несколько вычислительных узлов, объединенных с помощью некоторой быстрой технологии передачи данных и с установленным специальным программным обеспечением. Компьютерные кластеры в настоящее время получили большое распространение. Видимо, это связано, в первую очередь, с тем, что из-за постоянного снижения цен на оборудование и появление в последнее время соответствующего системного программного обеспечения технология создания кластеров стала общедоступной. Задач, которые пытаются решать с применением технологии кластеризации, - две. Первая связана с резервированием некоторых критических сервисов. Для этого применяются кластеры, настроенные таким образом, что при сбое одного из узлов, входящих в кластер, сервисы, обслуживаемые этим узлом, автоматически загружаются на другом узле кластера. Такой подход позволяет существенно минимизировать время простоя системы, а для некоторых видов сервисов к тому же абсолютно прозрачен для клиентов. Кластеры, построенные по такому принципу, называются отказоустойчивыми кластерами. 10