В данной главе мы представим метод 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):
Как видите, не нужно прилагать больших усилий, чтобы динамически вызвать метод. Фактически, вызвать метод достаточно просто, но построить запрос гораздо сложнее. Данная задача даже более запутана из-за множества способов, которые можно использовать для построения запроса и вызова удаленного метода. Как обычно, вы жертвуете простотой и производительностью ради дополнительной гибкости.
Процесс Динамического Вызова 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. Интерфейсы Динамических Вызовов
|
CORBA::Object |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CORBA::Request |
|
|
|
|
|
|
|
|
|
|
|
|
CORBA::NVList |
|
|
|
|
|
|
|
|
|
|
CORBA::Object |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Цена свободы
Сравним среднее временя отклика статических и динамических вызовов. Мы использовали 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 раз медленнее, чем их статические эквиваленты. Таким образом, вы жертвуете производительностью и простотой использования во имя максимальной гибкости.
назад | содержание | далее