|
Untitled Document
Ирен Русман
Федерация сервисных шин Oracle
в системе передачи сообщений «Запомнить-и-Передать»
с динамической маршрутизацией в SOA
(Oracle Service Bus Federation with JMS Store-and-Forward
and Dynamic Routing in SOA, by Irene Rusman)
Источник: сайт OTN корпорации Oracle , серия «Архитектура SOA », июнь 2008, www.oracle.com/technology/pub/articles/rusman-alsb.html
В этой статье описаны архитектура, проект и конфигурация федерации сервисных шин Oracle - Oracle Service Buses ( OSB , ранее AquaLogic Service Buses ). Эта федерация формируется кластером доменов ( clustered domains ) этих шин, связанных системой передачи сообщений на базе подхода « Запомнить-и-Передать » ( messaging Store - and - Forward ( SAF ) system ). В частности, в этой статье рассматривается архитектура, в рамках которой два периферийных кластера доменов инициируют связь типа запрос-ответ ( request - response ) с третьим, центральным доменом. Периферийные домены используют SAF для передачи запросов. Центральный домен использует SAF для передачи ответов периферийным доменам.
В этой статье описано, как конфигурировать домены сервисной шины Oracle Service Bus , а также представление о некоторых периферийных, но важных проблемах, таких как динамическая маршрутизация ( dynamic routing ) и корреляция ответа ( response correlation ) в рамках федеративной архитектуры.
Основы
Oracle Service Bus JMS – это система передачи сообщений уровня предприятия, основанная на Java Message Service ( JMS ) спецификации JMS 1.1, которая предоставляет многочисленные расширения к стандартным API -интерфейсам JMS . Эта система тесно интегрирована с платформой Oracle WebLogic Server , что позволяет создавать безопасные приложения для среды Java EE , которые можно мониторить и администрировать через консоль Oracle Service Bus .
Помимо полной поддержки расширенной архитектуры ( extended architecture - XA ) транзакций Oracle Service Bus JMS обеспечивает высокую готовность, благодаря функции поддержки кластеров и миграции серверов. Функция SAF ( Запомнить-и-Передать ) обеспечивает хранение сообщений, которые не могут быть доставлены к тем пунктам назначения, которые, возможно, расположены на удаленных хостах, пока они не станут доступны. Эта SAF -функция сконфигурирована со значениями по умолчанию, каждое из которых может быть настроено для удовлетворения потребностей конкретного приложения
Предложены три типичные топологии для развертывания:
- Распределенные хабы ( Distributed Hubs ) – распределенные OSB -домены, ответственные за маршрутизацию между ними, причем без центрального координатора. Распределенные хабы обслуживают домены приложений соответствующих дивизионов.
- Хаб предприятия ( Enterprise Hub ) – центральный OSB -домен предприятия в качестве центрального координатора или сервисной шины предприятия для доменов дивизионов, или департаментов предприятия. Домены дивизионов, в свою очередь, обслуживают прикладные домены для соответствующих дивизионов.
- Композитная модель ( Composite Model ) – комбинация обоих этих сценариев, распределенного и централизованного. В этом случае распределенные OSB -домены по-прежнему обеспечивают маршрутизацию между собой, например, при высоком уровне взаимодействия сервисов. Центральный OSB -домен может поддерживать вновь приобретенную компанию, соединяя федерацию (распределенных OSB -доменов) c внешними приложениями этой компании.
В качестве сценария-примера представим корпорацию, развертывающую Oracle Service Bus Enterprise Hub : два периферийных домена, соединенных с центральным. Это сценарий описан в секции “ Deployment Topology " (Развертывание топологии) по адресу architecture overview (Обзор архитектуры).
Далее я опишу архитектуру развертывания хаба предприятия, которая обеспечивает передачу сообщений между его доменами ( cross - domain messaging ).
Архитектура развертывания и установка
Периферийные домены получают запросы от JMS -клиентов, обрабатывают их с использованием proxy -сервисов и маршрутизируют, направляют эти запросы к локальным бизнес-сервисам. Эти бизнес-сервисы - просто оболочки. Они предназначены для хранения отправленных запросов-сообщений и передачи их удаленному центральному хабу.
Этот центральный хаб обрабатывает эти (для него) входящие сообщения, используя свой proxy -сервис и направляет их к локальному фоновому ( backend ) бизнес-сервису. Когда бизнес-сервис посылает сообщение-ответ, оно сначала прибывает к этому локальному proxy -сервису. Этот proxy -сервис запоминает уходящее сообщение-ответ и передает отдаленным периферийным доменам, которые должны передать его к клиентам JMS .
Как минимум, вы должны сконфигурировать в кластер (федерацию) три домена. В эту федерацию должны войти две периферийных домена ( Domain 1 и Domain 2 на рис. 1 ниже), через которые клиенты посылают начальные ( initial ) запросы центральному домену. Центральный домен ( Domain 3) получает эти запросы и шлет ответы обратно клиентам через два периферийных домена. Центральный домен является хостом для центрального proxy и базовых бизнес-сервисов.
На рис. 1 представлен пример архитектуры хаба предприятия. Он показывает три кластерированных домена с proxy - и бизнес-сервисами, сконфигурированными на каждом из них, пункты назначения JMS и поток сообщений – запросов и ответов.

Рис . 1. Конфигурация от OSB к OSB через SAF с двумя периферийными доменами с Proxy -сервисами, посылающими запросы к центральному домену с базовым бизнес-сервисом.
Для простоты предположим, что каждый домен состоит из административного сервера и кластера из двух управляемых серверов. Для описания этой установки введем имена: osb 1 и osb 2 - два периферийных домена, osb 3 - центральный домен. Серверы кластера будут называться:
- Domain osb1 - osb1Slave0, osb1Slave1
- Domain osb2 - osb2Slave0, osb2Slave1
- Domain osb3 - osb3Slave0, osb3Slave1
Используя эту архитектуру, давайте немного подробнее рассмотрим проектируемый нами сценарий:
- Первый JMS -клиент посылает запросы к JMS Proxy -сервисам по запросам-ответам сервера osb 1.
- Второй JMS -клиент посылает запросы к JMS Proxy -сервисам по запросам-ответам сервера osb 2.
- Чтобы обеспечить корректное распределение ответов, запросы содержат рубрику " reply - to ", которое читается Oracle Service Bus во время выполнения.
- Запросы направляются к локальному JMS Business Services по запросам-ответам в их собственным доменах osb 1 и osb 2.
- Запросы перенаправляются через SAF к JMS Proxy Services по запросам-ответам сервера osb 3.
- Запросы направляются к базовому сервису, сконфигурированному как JMS Business Services по запросам-ответам сервера osb 3.
- Базовое приложение устанавливает идентификатор ( ID ) корреляции с ответом в рубрику ID сообщения запроса, чтобы коррелировать сообщение-ответ через ID сообщения-запроса.
- Базовое приложение читает рубрику " reply - to " запроса для определения очереди ответов.
- Ответы размещаются в очереди ответов этого базового Business Service .
- Ответы отсылаются из очередей ответов этого базового Business Service в очереди ответов JMS Proxy Services в osb 3.
- Ответы перенаправляются через SAF в очереди ответов Business Services в osb 1 и osb 2.
- Ответы пересылаются дальше в очереди Uniform Distributed Queues ( UDQ ) Proxy -сервисов в osb 1 и osb 2.
- Если клиенты коррелируют по ID входящего и ID ответного сообщения, который соответствует ID JMS запроса-сообщения, клиенты получают ответы (каждый раз, когда JMS -сервер производит это сообщение, он назначает ему ID сообщения).
Важно помнить, что Oracle Service Bus разработана с расчетом на контракт. И пользователь должен выполнить свою часть контракта.
- Фоновое пользовательское приложение в центральном домене osb 3 должно читать рубрику " reply - to " из заголовка сообщения и послать сообщение-ответ этому пункту назначения.
- Пользователь должен установить корреляцию значением идентификатора в proxy -сервисе в центральном домене osb 3. Только тогда пункты назначения ответа будут устанавливаться динамически на основе " reply - to " и запросов перенаправленных к корректным периферийным доменам.
Эта архитектура с центральным хабом масштабируема. Периферийных доменов может быть больше, чем два. С каждым дополнительным периферийным доменом число очередей для входящих сообщений-ответов будет возрастать для обслуживания этих дополнительных доменов. Клиент волен посылать запрос через любой периферийный домен чтобы запросить сервис центрального домена. Следовательно, любой периферийный домен может быть переведен в offline, не влияя на способность клиента обратиться к сервису в центральном домене. Наличие фонового приложения в центральном домене подводит к повторному использованию централизованного сервиса. У клиентов есть преимущество использования периферийных доменов для локальных сервисов и центрального домена для централизованных. Тем самым организация доменов OSB в Enterprise Hub способствует оптимизации использования сервисов.
Далее в этой статье описывается, как конфигурировать такой Enterprise Hub .
Конфигурирование Configuration
В следующих секциях вы узнаете, как конфигурировать домены, составляющие Enterprise Hub .
Конфигурирование SAF
Начните с главой "Configure JMS SAF" в документации ( documentation ) по WebLogic Server. Там имеются подробные инструкции по администрированию и конфигурированию SAF .
Примечание автора: Эта статья предназначена для продвинутых пользователей, у которых уже есть опыт с работы с SAF . Я только изложу специфику конфигурирования SAF для Enterprise Hub .
У каждого домена есть SAF -агент, развернутый на кластере. Proxy -сервис в центральном домене osb 3 работает с экспортированной физической очередью класса UDO ( uniform distributed queue ) для запросов:
- ExpReqProxyUDQ-Domain3
- Бизнес-сервисы в периферийных доменах aslb 1 и osb 2 получат соответствующие импортированные UDQ :
- ImpReqBusUDQ-Domain1
- ImpReqBusUDQ-Domain2
Вы должны специфицировать локальные очереди для ответов (или UDQ на каждый управляемый сервер, если нужно) для бизнес-сервиса при использовании шаблона ID корреляции JMS -сообщения, как объясняется в документации Understanding Message ID and Correlation ID Patterns for JMS Request / Response . Следовательно, proxy -сервис в доменах osb 1 и osb 2 будет иметь локальные экспортированные очереди для ответов.
- osb1:
- ExpResBusQ1-Slave0
- ExpResBusQ1-Slave1
- osb2:
- ExpResBusQ2-Slave0
- ExpResBusQ2-Slave1
Proxy -сервис в центральном домене osb 3 будет иметь соответствующие локальные очереди для ответов, перенаправляемых к osb 1:
- ImpResBusQ1-Domain31
- ImpResBusQ2-Domain31
Для перенаправляемых к osb 2:
- ImpResBusQ3-Domain32
- ImpResBusQ4-Domain32
Важный элемент периферийной SAF -конфигурации osb 1 и osb 2 – это параметр < reply - to - saf - remote - context - name >. SAF -система читает значение этого параметра для определения пункта назначения ответа в центральном домене, прежде чем он будет перенаправлен в периферийный домен. < reply - to - saf - remote - context - name > должен быть полностью квалифицированным именем, состоящим из имени JMS -системы и имени удаленного контекста в центральном домене. Например:
<reply-to-saf-remote-context-name>
SystemModuleTest3!DOMAIN31-SAF-REM-CONTEXT
</reply-to-saf-remote-context-name>
Вы устанавливаете < reply - to - saf - remote - context - name > среди других импортированных параметров пункта назначения, используя административную консоль WebLogic , как описано в главе " Configure JMS SAF " документации по WebLogic Server .
Конфигурация канала связи в Oracle Service Bus
Детали конфигурации канала связи для SOAP - сообщений поверх JMS
Код “движка” WebLogic JAX - RPC Web services включает следующий алгоритм для корреляции сообщений-ответов: если ID корреляции JMS задан в сообщении-запросе, движок JAX - RPC Web services установит тот же самый ID корреляции JMS в сообщение-ответ; если же этот идентификатор не задан в запросе, то ID корреляции ответа установится в (поле) идентификатора сообщения-запроса.
Для федеративной архитектуры нужно устанавливать корреляции посредством ID -сообщений. Следовательно, мы должны гарантировать, что фоновое приложение получает сообщение-запрос без корреляционного JMS -набора ID -идентификаторов. Поскольку оба транспорта, входящий и уходящий, - это JMS , должно обеспечить код движка WebLogic JAX - RPC Web services с требуемыми заголовками, явно проходя сквозь транспортные заголовки уходящего сообщения-запроса с использованием действия Transport Headers в Route -узле.
Для исключения ID из корреляционного JMS -набора передаваемых заголовков, следует удалить ID с использованием другого действия Transport Headers . Это гарантирует, что фоновый ( backend ) код движка JAX-RPC сервисов будет коррелировать (соотносить) ответы по ID JMS сообщения.
Использование динамической маршрутизации сообщений для выбора удаленного домена
Если для используемой статичной конфигурации конечных точек proxy - и бизнес-сервисов не достаточно, то можно маршрутизировать сообщение, используя заголовок, прочитанные во время выполнения. Чтобы совершить это, нужно сконфигурировать действие Dynamic Routing (или Dynamic Publishing , если ответ не ожидается).
Когда конфигурируется Dynamic Routing , вы должны специфицировать сервис. Если это простой ( plain ) JMS -сервис, вы специфицируете полную дорогу к нему. Если же сервис основан на WSDL , вы выбираете его из WSDL . Специфицирование операции опционально . Dynamic Routing и Dynamic Publishing позволяют динамически выбирать сервисы на основе содержания сообщения или заголовков, причем возможно преобразование сообщений с помощью целевого сервиса.
Ниже приведены примеры, показывающие, как предоставить имя сервиса непосредственно или используя XQuery :
<ctx:route>
<ctx:service isProxy="false">soapjms/JMSTransportService-BS</ctx:service>
<ctx:operation>{$operation}</ctx:operation>
</ctx:route>
<ctx:route>
<ctx:service isProxy="false">{$header/service[0]/text() }</ctx:service>
<ctx:operation>{$operation}</ctx:operation>
</ctx:route>
Вы можете также создать Query for Dynamic Routing , как ресурс, и специфицировать имя этого ресурса в конфигурации. Такая маршрутная команда будет соответствовать сервису и операции, если это обеспечено в определении бизнес-сервиса, и вызовет этот сервис (операцию).
Dynamic Routing –мощная функция. Применение Dynamic Routing в распределенной среде федеративных OSB -доменов обеспечивает отсылку сообщений к любому удаленному домену. Dynamic Routing – это вычисление пункта назначения, выполняемое в Route -узле во время выполнения. Результат такого вычисления подавляет предварительно определенный целевой сервис и, возможно, операцию, если это задано.
Лучший способ организовать Dynamic Routing – это создать таблицу роутинга ( Routing Table ). Эта Routing Table представляет собой просто XML -файл, зарегистрированный как XQuery ресурс, например:
<routing>
<row>
<logical>osb1</logical>
<physical>soapjms/JMSTransportService-BS1</physical>
</row>
<row>
<logical>osb2</logical>
<physical>soapjms/JMSTransportService-BS2</physical>
</row>
</routing>
Тогда можно использовать действие Assign класса обработки сообщений, чтобы дойти к физическому пункту назначения, проходя через логический:
<ctx: route>
<ctx: service>
{$routingtable/row[logical/text()=$logicalidentifier]/physical/text()}
</ctx: service>
</ctx: route>
$ logicalidentifier будет действительным XPath для извлечения логического идентификатора из сообщения. Если сообщение содержит этот логический идентификатор в своем теле, выражение XPath начнется с $ body .
Конфигурирование OSB для Dynamic Routing описано в секции " Using Dynamic Routing " документа Modeling Message Flow в OSB .
Установка атрибутов маршрутизации с опциями маршрутизации
Действие Routing Options предназначено для установки различных свойств в переменной Message Context уходящего сообщения. Эти свойства включают Quality - of - Service, URI и Mode , которые влияют на действия по публикации и маршрутизации ( Publish and Route ). Хотя эти элементы могут быть установлены с применением Assign , Insert , Replace и Delete , их использование требует некоторого знания XPath и/или XQuery, также как и знания XML -структуры контекстного значения уходящего сообщения.
Цель действия Routing Options – облегчить для пользователя установку этих свойств. Кроме того, производительность – это дополнительная цель, так как основное представление переменных контекста входящих и уходящих (сообщений), начиная с AquaLogic Service Bus 2.5 - это POJO ( Plain Old Java Object ). Это действие позволяет прямую манипуляцию POJO , вместо обработки в формате XML , что требует больше действий преобразований.
Набор свойств, с которыми можно манипулировать по действию Routing Options :
- URI – специфицирует место посылки сообщения
- Mode – специфицирует шаблон коммуникаций – запрос только или запрос-ответ
- Quality - of - service – специфицирует качество сервиса – наилучшее ( best - effort ) или однократное ( exactly - once )
- Retry - count – специфицирует число попыток, которые транспортный слой должен предпринять в случае ошибок
- Retry - interval – специфицирует время ожидания в миллисекундах между попытками
Замечание: При выполнении действия Routing Options , значение контекста уходящего сообщения выбирается из Message Context . Если эта значение еще не определено, будет сгенерирована ошибка. Иначе, это действие перейдет к установке этих элементов в уходящем сообщении как специфицировано в конфигурации действия.
Заключение
Цель этой статьи в том, чтобы показать, что Oracle Service Bus разработана с возможностью формирования федераций. Мы хотим обратить внимание IT -департаментов на преимущества развертывания с самого начала сети сервисных шин. Такой подход окажется правильным в стратегическом отношении в предвидении будущего роста IT -инфраструктуры.
Подробности такого конфигурирования вооружат продвинутых пользователей уверенностью в реальности сети сервисных шин. Гаданиям нет места, нужно шире использовать лучшие практики.
Ирен Русман ( Irene Rusman ) – старший софтверный инженер корпорации Oracle . Она работает над системной интеграцией на основе Oracle Service Bus .
|