В частности, один из вариантов таких сред предлагает совместная разработка компаний Sun Microsystems и Motorola, которая называется Openwings. Она построена на основе языка программирования Java и технологии Jini, которые позволяют не только исполнять код программы на различном оборудовании, но и находить необходимые компоненты для работы приложений. Основная архитектурная идея Openwings заключается в предоставлении приложению всех необходимых для его работы служб. Именно поэтому разработчики Openwings называют ее средой, ориентированной на службы.

Сервис всему голова

Для того чтобы понять, что такое распределенная ориентированная на службы среда Openwings, нужно сначала определить такие базовые понятия, как компонент, служба, пространство компонентов, контейнер и коммуникатор.

Компонент (Component) — это фрагмент приложения, реализующий строго определенный набор функций. Компоненты являются элементами прикладной системы и не входят в состав Openwings, которая обеспечивает пользователям доступ к функциональным возможностям компонентов.

Служба (Service) — это набор функций, реализуемых компонентом. Служба определяется разработчиком компонента и описывается в виде набора интерфейсов. Операционная среда по определенным правилам может получить описание сервиса и предоставить его другим компонентам. Интерфейсы в Openwings описываются на языке, аналогичном языку определения интерфейсов CORBA IDL (Interface Definition Language).

Пространство (Space) — это группа компонентов, объединенных по какому-либо признаку (например, по производителю). Пространства могут быть иерархическими, т. е. внутри одного пространства можно выделить другое. Создание пространств, как групп компонентов, как правило, выполняется администратором системы и используется для упрощения администрирования.

Контейнер (Container) обеспечивает взаимодействие компонента со средой. Он контролирует его жизненный цикл и обеспечивает другим компонентам использование предоставляемой службы. Именно через контейнер и происходит взаимодействие компонента с операционной средой и другими компонентами. В качестве контейнера может выступать, например, EJB-контейнер, Web-сервер или Web-браузер.

Коммуникатор (Connector) обеспечивает взаимодействие компонентов. Он состоит из двух частей, интегрируемых средой в компоненты, взаимодействие которых следует организовать. Коммуникатор обеспечивает передачу данных от одной части к другой по специальному протоколу, который может быть синхронным или асинхронным. Коммуникатор передает данные от компонента-оператора службы к компоненту-потребителю. Коммуникаторы могут устанавливать соединение по разным физическим линиям, используя при этом разные протоколы, однако пользователь обычно не знает, как именно работает тот или иной коммуникатор.

Основной задачей среды, подобной Openwings, является предоставление пользователю необходимых ему служб. При этом среда скрывает от пользователя операционную систему, сетевое взаимодействие и расположение программных компонентов. Все это не контролируется пользователем, но управляется администратором. При этом связь устанавливается с помощью коммуникаторов, управление реализуется контейнерами по определенным правилам, а сами службы предоставляются компонентами.

Основной проблемой для нормального функционирования подобной системы является поиск и использование нужных служб. У большинства систем конфигурация оборудования определяется либо во время их создания, либо во время запуска по файлам конфигурации. Такой метод настройки можно назвать статическим, поскольку во время работы программы считается, что конфигурация оборудования измениться не может. Однако в быстроменяющейся сетевой среде настройка программного обеспечения под аппаратуру должна выполняться динамически, поскольку каналы связи могут разорваться, жесткие диски — выйти из строя и придется их менять на ходу, не выключая системы. В общем, современное состояние вычислительной техники таково, что статическое конфигурирование программного обеспечения должно смениться динамическим.

Компонентные системы, которые строятся по принципу динамического конфигурирования, должны обеспечивать своим компонентам возможность исследования среды и поиска других компонентов. Исследовав среду, компонент должен самостоятельно подстроится под ее конфигурацию. После этого компонент может найти другие компоненты, которые могли бы реализовать нужные ему для работы службы. При любой ошибке в работе компонент вправе повторить последовательность этих действий и изменить свою конфигурацию так, чтобы соответствовать измененным условиям работы. Такой метод динамического конфигурирования уже используется в некоторых технологиях, таких как Jini (компания Sun Microsystems), Cha (Hewlett-Packard), Universal Plug?n?Play (Microsoft) и проект Ninja (Университет Беркли). В Openwings, по понятным причинам, была использована технология Jini.

Шесть составных частей Openwings

В Openwings предусмотрен набор базовых служб, которые и обеспечивают функционирование системы. Эти службы разделены на шесть групп, каждая из которых выполняет следующие задачи: обслуживание компонентов (Component Service), установление взаимодействия компонентов (Connector Service), хранение данных (Data Service), распределение аппаратных ресурсов (Platform Service), управление системой (Management Service) и обеспечение безопасной работы системы (Security Service). Рассмотрим каждую из этих групп служб более подробно.

Рис.1. Общая архитектура Openwings

Компоненты

Компонентные службы дают компонентам возможность исследования операционной среды и поиска сторонних служб. Группа этих служб, реализованных в Openwings, обеспечивает работу компонента с любым аппаратным, программным и сетевым обеспечением. Эти службы скрывают от компонента (и от его разработчика) подробности реализации нужных ему служб, что позволяет разбить сложную систему на множество модулей, каждый из которых можно будет совершенствовать по отдельности. Модуль может быть повторно использован или модифицирован.

С точки зрения разработчика модуля компонентные службы используются для интеграции разрабатываемого им компонента в конкретную среду. Поэтому для нормального функционирования компонента он должен реализовать предоставляемую службу и описать доступ к ней в виде интерфейсов. Кроме того, нужно предусмотреть процедуры переноса компонента в другую среду, а также автоматическую настройку компонента и его перенастройку в случае сбоя. Так необходимо реализовать процедуру сворачивания и модернизации модуля.

Компонентная служба Openwings основывается на модели, принятой в Jini. Например, с его помощью можно не просто найти в локальной сети принтер, который может печатать документ на PostScript, но и найти лучший из таких принтеров по определенным параметрам. В системе с динамическим изменением конфигурации важно найти тот компонент, который не просто предоставляет необходимую службу, но и сделает это оптимальным образом. Для реализации такого механизмы компонентные службы используют, в свою очередь, службы управления Openwings, которые работают в соответствии с правилами, установленными администратором.

Коммуникации

За установление связей между различными компонентами в Openwings отвечают службы, объединенные в группу коммуникационных. Эти службы обеспечивают взаимодействие компонентов вне зависимости от того, где те располагаются. Это взаимодействие может быть синхронным и асинхронным. Примером синхронного взаимодействия является Java RMI, CORBA и DCOM, а асинхронного — Java Message Service и CORBA Message Service. В Openwings коммуникационные службы реализованы на удаленном вызове методов Java RMI. Те компоненты, которым необходимо синхронное взаимодействие, должны содержать интерфейс, все методы которого порождают исключительную ситуацию java.rmi.RemoteException. Для поддержки асинхронного взаимодействия используется интерфейс, у которого все методы не возвращают никакого значения.

Рис.2. Архитектура коммуникатора

Конструктивно коммуникатор представляет собой два фрагмента кода, которые устанавливают связь друг с другом. Причем код со стороны пользователя и со стороны оператора службы отличается. Обе стороны коммуникатора генерируются автоматически по описаниям интерфейсов, которые формулирует разработчик компонента на языке IDL. Этот код генерируется компонентом Connector Generator, который привязывает интерфейс к конкретным сетевым протоколам. После этого сгенерированная программа компилируется и может быть загружена в систему компонентом Connector Loader. После этого коммуникатор превращается в прозрачный канал для передачи вызовов методов от пользователя к оператору службы.

Распределение аппаратных ресурсов

Службы по распределению машинного времени, печати и хранения информации собраны в группу распределения ресурсов. В Openwings распределяются три типа аппаратных ресурсов — машинное время, доступ к принтерам и система хранения. Любой компонент может получить доступ к этим ресурсам, если это соответствует установленной политике безопасности. Работы по созданию систем распределенного управления сетевыми ресурсами и ранее велись компанией Sun, для чего были созданы группа Jini Printer Working Group и проект Sun под названием Jiro Storage Management. Впрочем, основной в любом контейнере является служба распределения машинного времени или служба обработки (Processing Service).

Каждый контейнер Openwings имеет службу обработки, которая занимается запуском компонентов, их остановкой и восстановлением после сбоя. Служба обработки также обеспечивает инициацию всех компонентов во время запуска системы, динамическую модернизацию программного обеспечения, и, если необходимо, перемещение компонентов в другой контейнер. Для модернизации можно использовать три режима замены — без остановки (hot), по мере надобности (warm) и с полной остановкой (cold). Если компонент модернизируется без остановки выполнения, то новый код начинает работать сразу, как только появился в системе. Это возможно, если он пользуется теми же интерфейсами, что и старый компонент. В этом случае все ресурсы старого переключаются на новый компонент. При модернизации по мере надобности новый код начинает обслуживать новых пользователей, пока старый завершает обслуживание старых. В этом случае можно полностью изменить интерфейс, поскольку подключение новых пользователей происходит уже к новым интерфейсам. Можно также полностью остановить работу службы и затем уже проводить модернизацию.

Рис. 4. Архитектура WingCentral

Важной задачей службы обработки является перемещение компонентов из одной среды в другую. Это позволяет реализовать кластерную систему со средствами балансировки нагрузки. В Openwings перенос компонентов происходит по следующей схеме: вначале компонент сохраняет свое состояние и высвобождает закрепленные за ним ресурсы, затем исполнение компонента завершается в одном контейнере и передается в другой, там компонент запускается и у него восстанавливается сохраненное ранее состояние. Понятно, что все связи компонента приходиться при этом разорвать и заново установить, а все ресурсы должны быть освобождены и выделены вновь. Перемещение компонентов из одной среды в другую позволяет сбалансировать нагрузку между разными компьютерами, а также обеспечить возможность быстро восстанавливать службу после сбоев того или иного компонента. Служба обработки также предоставляет информацию о машинных ресурсах — свободной памяти и загрузке процессора.

Хранение данных

Важным элементом любой компьютерной системы являются базы данных, поэтому разработчики Openwings просто обязаны были обеспечить приложениям доступ к базам данных. Такой доступ реализован посредством специальной группы служб, которая носит название службы доступа к данным. Причем он позволяет компонентам одинаковым способом работать как с реляционными (через интерфейс JDBC) и объектными СУБД, так и с обычными файлами. Основным компонентом, обеспечивающим доступ к данным, является Data Server. Компоненты общаются с ним с помощью запросов на языке объектных запросов Object Query Language (OQL). При этом Data Server фактически выступает в качестве менеджера транзакций, который контролирует корректность операций записи в базу данных. Это гарантирует целостность данных, даже если какой-либо компонент был остановлен или с ним оборвалась связь. Таким образом, Data Server обеспечивает в Openwings хранение данных, порождаемых компонентами.

Управление

Наиболее сложным в распределенной системе является автоматическое управление работой всех компонентов. Подобное управление, по задумке разработчиков Openwings, следовало бы свести к минимальному администрированию. Решение этой задачи они попытались найти в идее использования наборов правил, по которым компонент может определить состояние среды. Правила содержат как данные о конфигурации системы, так и методы для их изменения. Все правила хранятся в XML-формате.

Управление в Openwings основано на правилах и реализует модель Java Management Extensions (JME). Каждый компонент (или пространство) управляется с помощью специальных модулей управления (MBean) и модулей правил (PBean). Кроме того, каждый компонент должен реализовать интерфейс управления, через который к нему может подключиться компонент управления WingCentral. Этот компонент обеспечивает администратору Openwings возможность контролировать работу системы. Администратор работает с WingCentral через следующие компоненты: Runtime View — предоставляет информацию о состоянии среды, Design View — позволяет конфигурировать элементы среды, Maintenace View — контролирует установку, производительность и доступность компонентов, Security View — управляет безопасностью. Впрочем, интерфейсы WingCentral открыты, и всякий программист может дописать к нему свою графическую панель.

Рис. 3. Кластеризация служб обработки

Поскольку Openwings рассчитана на использование в постоянно меняющейся среде, то важное значение в ее работе приобретает запуск системы. Дело в том, что система при старте должна изучить свое сетевое окружение и правильно подключиться к уже существующей сетевой инфраструктуре. Для этого в сети должны работать три сетевых службы: имен (DNS), распределения IP-адресов (DHCP) и определения времени (NTP). Система автоматически их находит и использует для подключения к уже работающим контейнерам Openwings. Только после того, как выяснены подробности сетевой инфраструктуры, запускается служба обработки, которая, в свою очередь, начинает инициировать остальные компоненты и службы.

Безопасность

Поскольку система управления Openwings основана на правилах, то было бы логично распространить их и на службы безопасности. Действительно, в Openwings используется модель безопасности на основе правил, ролей и меток конфиденциальности. Задачи, решаемые службами безопасности, фактически стандартны: аутентификация пользователей, авторизация использования компонент - системы, проверка правильной работы служб безопасности, обеспечение конфиденциальности и целостности данных. При этом используется модель Java Authentication and Authorization Service (JAAS), инфраструктура публичных ключей, протокол SSL и цифровые сертификаты. Для установления защищенного взаимодействия можно использовать коммуникатор с шифрованием по протоколу SSL.

Заключение

Одним из основных требований к Openwings со стороны заказчика совместных исследований Sun Microsystems и Motorola — Министерства обороны США — было обеспечения высокого уровня готовности служб. Для этого нужно решить две задачи: увеличить время бесперебойной работы и уменьшить время восстановления компонентов. Увеличить бесперебойную работу служб можно с помощью их резервирования, переноса компонентов с одного компьютера на другой, балансировки загрузки, корректной обработки ошибок и исключительных ситуаций. Все эти возможности реализованы в Openwings. Для быстрого восстановления достаточно обеспечить своевременное обнаружение неработающей службы и быстрое восстановление компонента, который его поддерживал. Этим в основном заведует служба обработки. В частности, в ней предусмотрены так называемые «предзапущенные» компоненты, которые уже инициированы виртуальной Java-машиной, но еще не могут предоставлять свои услуги сторонним компонентам. Кроме того, три режима модификации компонентов позволяют минимизировать время регламентных работ и перехода на новую версию программно.

Openwings создается для работы интеллектуальных устройств в быстро меняющейся сети. При этом можно наращивать мощность системы постепенно, добавляя новые компьютеры и модернизируя компоненты. Использование современных технологий автоматического конфигурирования системы позволяет упростить работу администратора, который должен лишь правильно сформулировать правила работы компонентов. Работа предварительной версии ранее в этом году Openwings была продемонстрирована экспертам Пентагона и они остались ей довольны.