Динамическая CORBA

В данной главе мы представим метод run-time связывания без использования стабов — Интерфейс Динамических Вызовов CORBA (Dynamic Invocation Interface — DII). CORBA DII позволяет клиенту выбрать любой целевой объект во время выполнения и затем динамически вызывает его методы. Ваш клиент может вызвать любую операцию на любом объекте без необходимости прекомпиляции стабов. Это означает, что клиент исследует информацию, связанную с интерфейсом, во время вызова и не требует каких-либо сведений этапа компиляции.

В мире клиент/сервер интерфейс DII наиболее близок к обеспечению абсолютной свободы. Серверы обслуживают новые сервисы и интерфейсы, как только те становятся доступны. Клиенты обнаруживают такие интерфейсы во время выполнения и узнают, как их вызывать. Это и есть волшебство CORBA. DII предоставляет очень динамичную среду, которая позволяет вашим системам оставаться гибкими и pacшиpяeмыми. Это очень хорошая возможность, особенно в "межгалактической" среде, подобной Internet.

Но каким образом клиенты могут изначально обнаружить такие удаленные объекты? Это выполняется с помощью нескольких механизмов. В простейшем случае вы можете предоставить клиенту строковую («stringified»— буквально, "превращенный в строку", именно этот смысл мы и будем вкладывать в словосочетание "строковая объектная ccылка") объектную ссылку. Клиент может преобразовать эту строку в ссылку на реальный объект и установить связь. Кроме того, клиенты могут выполнять поиск объектов по именам, используя Сервис Именования (Naming Service) CORBA. Клиенты могут обнаруживать объекты используя "желтые страницы" CORBA - Трейдер Сервис (Trader Servicе).

В среде Object Web объекты будут обнаруживаться динамически благодаря поисковым серверам, сервисам публикаций и подписки, и различным видам Web-агентов (spiders, crawlers, bots и т.д.). Производите будут предоставлять самые новые и самые лучшие версии объектов. Этот мир будет намного более динамичным, чем сегодня. Как только клиенты обнаружат требуемые объекты, им понадобится CORBA DII, чтобы вызывать методы этих объектов. Альтернативой является загрузка Java-апплетов с заранее построенными клиентами для определенных сервисов. Право на существование имеют оба подхода.

ДИНАМИЧЕСКИЕ ВЫЗОВЫ CORBA

Прежде чем вы сможете динамически вызвать метод объекта, сначала необходимо найти этот объект и получить на него ссылку. Как только вы получите объектную ссылку, то сможете использовать ее для получения интерфейса объекта и, соответственно, строить запросы динамически. В запросе следует указать желаемый метод и его параметры. Обычно эту информацию вы получаете из Репозитария Интерфейсов (Interface Repository — IR). Трейдер Сервис может дополнять IR. Например, в нем может определяться диапазон значений, допустимых для сервера.

Динамические вызовы: общее описание

Предположим, что вы каким-то образом получили ссылку на объект, для которого собираетесь выполнять динамические вызовы. Ниже дано описание самого высокого уровня абстракции вызова удаленного метода заданного объекта (см. Процесс Динамического вызова CORBA):

  1. Получить имя интерфейса. В нашем сценарии мы располагаем ссылкой серверного объекта. Объекты CORBA интроспективны ("introspection" самоанализ, "introspective" - самоописываемый), то есть они могут предоставить о себе всю необходимую информацию. Следовательно, мы можем запросить у объекта имя его интерфейса с помощью метода get_interface. Такой вызов возвращает ссылку на объект InterfaceDef. Этот объект, находящийся в Репозитарии Интерфейсов, описывает интерфейс интересующего нас объекта. Репозитарии Интерфейсов мы рассмотрим в главе 6.
  2. Получить описание метода из Репозитария Интерфейсов. Мы можем использовать InterfaceDef как точку входа для навигации по Репозитарию Интерфейсов. Мы можем получить все типы подробной информации об интерфейсе и поддерживаемых им методах. CORBA предоставляет около 10 вызовов для навигации по Репозитарию Интерфейсов и описания содержащихся в ней объектов. В нашем примере клиент вызывает lookup_name для поиска метода, который необходимо вызвать. Затем клиент вызывает describe для получения полного IDL-определения интересующего нас метода. Или вы можете вызвать describe_interface для получения полного описания интерфейса и поиска необходимого вам метода.
  3. Создать список аргументов. CORBA определяет самоописываемую структуру данных для передачи параметров. Эта структура называется Списком Именованных Величин (Named Value List - NVL). Для работы с этим списком вам следует использовать псевдообъект NVList. Список создается Вызовом create_list и заполняется с помощью вызовов add_item, количество которых соответствует числу аргументов - параметров. Второй подход состоит в том, что ORB сам создаст список за вас, если вы воспользуетесь вызовом create_operation_list объекта CORBA::ORB. Методу create_operation_list необходимо передать имя интересующей вас операции.
  4. Построить запрос (request). Запрос представляет собой псевдообъект CORBA, который содержит имя метода, список аргументов и возвращаемое значение (то есть, запрос описывает сигнатуру метода). Запрос создается с помощью вызова create_request. Ему следует передать имя вызываемого метода, NVList и указатель на возвращаемое значение. Альтернативный способ состоит в создании краткой версии запроса с помощью вызова create_request и передачи ему имени требуемого метода. Используйте краткую версию запроса для вызова метода, не требующего аргументов.
  5. Выполнить запрос. Выполнить запрос можно одним из трех способов: 1) вызов invoke пересылает запрос и получает результаты;2) вызов send_deferred возвращает управление программе, которая затем должна опрашивать наличие ответа с помощью poll_response или get_response; и 3) отправляемый вызов может быть определен как дейтаграмма (дейтаграмма — сообщение, передаваемое в одну сторону, т.е. от посылающего объекта к принимающему без необходимости ожидания отклика от последнего) с помощью вызова send_oneway, который подразумевает, что ответ не нужен. Три перечисленных стиля иногда называются синхронный, отложенный синхронный и односторонний.

Как видите, не нужно прилагать больших усилий, чтобы динамически вызвать метод. Фактически, вызвать метод достаточно просто, но построить запрос гораздо сложнее. Данная задача даже более запутана из-за множества способов, которые можно использовать для построения запроса и вызова удаленного метода. Как обычно, вы жертвуете простотой и производительностью ради дополнительной гибкости.

Процесс Динамического Вызова CORBA

1. Obtain Interface Name

get_interface() //object

2. Obtain Method Description

lookup_name() // Interface

describe() // Repository

3. Create Argument List

create_list()

add_item()...add_item()...add_item()

4. Create this Request

create_request(Object Reference, Method, Argument List)

5. Invoke the Remote Meyhod (3 ways of doing Remote Invocation)

Using RPC Invoke()

or

Send/Receive send_deferred()

get_response()

or

Datagram send_oneway()

Интерфейсы Динамических Вызовов (Dynamic Invocation Interfaces - DII)

Сервисы, необходимые для динамического вызова объекта, являются частью ядра CORBA. К сожалению, эти методы распределены по четырем интерфейсам в модуле (подразумевается модель, определенный на IDL) CORBA (см. методы со светлыми кнопками на табл.5-1). Ниже дан краткий обзор методов четырех интерфейсов, которые вы используете для динамических вызовов:

В дополнение к этим четырем интерфейсам для конструирования удаленных вызовов вы также используете объекты Репозитария Интерфейсов.

табл. 2. Интерфейсы Динамических Вызовов

  • get_implementation

CORBA::Object

  • non_existing
  • get_interface
  • is_equivalent
  • is_nill
  • hash
  • dublicate
  • create_request
  • release
  • request
  • is_a
 
  • add_arg

CORBA::Request

  • invoke
  • send_oneway
  • send_deferred
  • get_response
  • poll_response
  • delete
  • add_item

CORBA::NVList

  • add_value
  • get_count
  • remove
  • free
  • free_memory
  • object_to_string

CORBA::Object

  • BOA_init
  • string_to_object
  • list_initial_services
  • create_list
  • resolve_initial_references
  • create_operation_list
  • send_multytiple_requests_oneway
  • get_default_context
  • send_multytiple_requests_oneway
  • create_environment
  • poll_next_response
 
  • get_next_response

 

Цена свободы

Сравним среднее временя отклика статических и динамических вызовов. Мы использовали VisiBrokerfor Java ORB на локальной сети Ethernet. Среднее время отклика (в миллисекундах) основано на 1000 вызовах удаленного метода. Мы выполняли динамический замер как с учетом, так и без учета издержек, связанных с построением запроса. Результаты показаны в таблице 5-2. Числа показывают, что динамические вызовы примерно в 40 раз медленнее, чем их статические эквиваленты. Такой сюрприз объясняется огромными издержками, связанными с построением запроса. Это, определенно, не дешево. Естественно, мы выполняем несколько обращений к библиотеке интерфейсов каждый раз при построении запроса. А это выливается во множество машинных циклов и несколько обрашений к диску. Такова цена свободы. Вы все еще готовы обменять производительность на гибкость? Мы уверены, что в определенных ситуациях в этрм есть смысл. Но мы пока не собираемся выбрасывать наши стабы

Таблица 3. Сравнение динамического и статического Ping.

 

Динамический Ping

Статический Ping

 

С подготовкой

Без подготовки

 
Производитльность удаленного Ping 131,4 мсек. 3,3 мсек. 3.2 мсек.

 

Когда использовать динамику

Традиционная CORBA предоставляет вам только два варианта выбоpa для осуществления вызовов: статические прекомпилированные стабы или динамические вызовы с использованием DII. Java дает третий вариант: загружаемые (downloadable) стабы. Помните, байт-код стабов - это классы Java. Вы загружаете их вместе с аплетом. Итак, вы получили обе части - код клиента и стаба — это и есть технология загружаемых клиентов. Итак, какой же из трех способов следует применять? Это зависит от используемой вами модели (см. таблицу 5-3).

Таблица 4. DII и его альтернативы.

Используемая модель Рекомендуемый способ вызова
Клиент часто вызывает серверный объект; серверный объект не изменяется Используйте статические прекомпилированные стабы.
Клиент изредка вызывает серверный объект. Используйте динамические вызовы (DII).
Клиент обнаруживает серверный объект вo время выполнения. Используйте динамические вызовы (DII).
Клиент выполняется внутри браузера; он обнаруживает новые объекты. Используйте загружаемые аплеты и статические стабы. Аплет становится клиентом данного объекта.

 

CORBA DII позволяет вам конструировать удаленный вызов "на лету". Эта технология привносит стиль динамического программирования, который позволяет обнаружить объект во время выполнения и сразу установить с ним связь. Кроме того, вы избавлены от управления стабами и распределения их по клиентам. В этом случае сводится на нет проблема различных версий — вы всегда связываетесь с наиболее свежим интерфейсом, предоставляемым объектом. Однако, такая свобода достается весьма недешево. Во-первых, она требует больших усилий по программированию. Во-вторых, динамические вызовы примерно в 40 раз медленнее, чем их статические эквиваленты. Таким образом, вы жертвуете производительностью и простотой использования во имя максимальной гибкости.


назад | содержание | далее

Hosted by uCoz