
- •Глава 2 Связь
- •2.1. Уровни протоколов
- •2.1. Уровни протоколов 83
- •84 Глава 2. Связь
- •2.1. Уровни протоколов 85
- •2.1.1. Низкоуровневые протоколы
- •86 Глава 2. Связь
- •2.1. Уровни протоколов 87
- •2.1.2. Транспортные протоколы (метод_Метелап лр_1)
- •88 Глава 2. Связь
- •2.1. Уровни протоколов 89
- •92 Глава 2. Связь
- •2.1.3. Протоколы верхнего уровня
- •2.1. Уровни протоколов 91
- •92 Глава 2. Связь
- •2.2. Удаленный вызов процедур 93
- •2.2. Удаленный вызов процедур
- •94 Глава 2. Связь
- •2.2.1. Базовые операции rpc
- •2.2. Удаленный вызов процедур 95
- •96 Глава 2. Связь
- •2.2. Удаленный вызов процедур 97
- •98 Глава 2. Связь
- •2.2.2. Передача параметров
- •2.2. Удаленный вызов процедур 99
- •100 Глава 2. Связь
- •2.2. Удаленный вызов процедур 101
- •102 Глава 2. Связь
- •2.2. Удаленный вызов процедур 103
- •2 .2.3. Расширенные модели rpc
- •104 Глава 2. Связь
- •2.2. Удаленный вызов процедур 105
- •106 Глава 2. Связь
- •2.2.4. Пример — dce rpc
- •2.2. Удаленный вызов процедур 107
- •108 Глава 2. Связь
- •2.2. Удаленный вызов процедур 109
- •110 Глава 2. Связь
- •2.3. Обращение к удаленным объектам 111
- •2.3. Обращение к удаленным объектам
- •112 Глава 2. Связь
- •2.3.1. Распределенные объекты
- •2.3. Обращение к удаленным объектам 113
- •114 Глава 2. Связь
- •2.3.2. Привязка клиента к объекту
- •2.3. Обращение к удаленным объектам 115
- •116 Глава 2. Связь
- •2.3. Обращение к удаленным объектам 117
- •2.3.3. Статическое и динамическое удаленное обращение к методам
- •118 Глава 2. Связь
- •2.3.4. Передача параметров
- •2.3. Обращение к удаленным объектам 119
- •120 Глава 2. Связь
- •2.3.5. Пример 1 — удаленные объекты dce
- •2.3. Обращение к удаленным объектам 121
- •122 Глава 2. Связь
- •2.3.6. Пример 2 — Java rmi
- •2.3. Обращение к удаленным объектам 123
- •124 Глава 2. Связь
- •2.3. Обращение к удаленным объектам 125
- •126 Глава 2. Связь
- •2.4. Связь посредством сообщений
- •2.4.1. Сохранность и синхронность во взаимодействиях
- •2 .4. Связь посредством сообщений 127
- •128 Глава 2. Связь
- •2.4. Связь посредством сообщений 129
- •130 Глава 2. Связь
- •2.4. Связь посредством сообщений 131
- •2.4.2. Нерезидентная связь на основе сообщений
- •132 Глава 2. Связь
- •2.4. Связь посредством сообщений 133
- •134 Глава 2. Связь
- •2.4. Связь посредством сообщений 135
- •136 Глава 2. Связь
- •2.4.3. Сохранная связь на основе сообщений
- •2.4. Связь посредством сообщений 137
- •1 38 Глава 2. Связь
- •2.4. Связь посредством сообщений 139
- •140 Глава 2. Связь
1 38 Глава 2. Связь
Примитив put вызывается отправителем для передачи сообщения базовой системе, где оно будет помещено в соответствующую очередь. Как мы объясняли, это неблокирующий вызов. Примитив get — это блокирующий вызов, посредством которого авторизованный процесс может извлечь самое старое сообщение из определенной очереди. Процесс блокируется только в том случае, если очередь пуста. Варианты этого вызова включают в себя поиск в очереди определенного сообщения, например, с использованием приоритетов или образца для сравнения. Неблокирующий вариант представлен примитивом poll. Если очередь пуста или искомое сообщение не найдено, вызвавший этот примитив процесс продолжает свою работу.
И, наконец, большинство систем очередей сообщений поддерживают также процесс вставки дескриптора функции обратного вызова {callback function), которая автоматически вызывается при попадании сообщения в очередь. Обратные вызовы могут быть также использованы для автоматического запуска процесса, который будет забирать сообщения из очереди, если ни один процесс в настоящее время не запущен. Подобное поведение обычно реализуется при помощи демона на стороне получателя, который постоянно проверяет очередь на наличие входящих сообщений и поступает в соответствии с результатами проверки.
Общая архитектура системы очередей сообщений
Давайте теперь рассмотрим поближе, как выглядит обобщенная система очередей сообщений. Одно из первых ограничений, которые мы сделаем, будет состоять в том, что сообщения могут быть помещены только в локальные очереди отправителя, то есть в очереди, находящиеся на той же самой машине или, во всяком случае, не дальше, чем на соседней, то есть машине, входящей в ту же локальную сеть. Подобная очередь называется исходящей очередью {source queue). Аналогично, прочитаные сообщения могут быть только из локальных очередей. Сообщение, помещенное в очередь, содержит описание очереди назначения {destination queue), в которую оно должно быть перемещено. В обязанности системы очередей сообщений входит предоставление очередей отправителям и получателям и обеспечение перемещения сообщений из исходящих очередей в очереди назначения.
Важно понимать, что набор очередей разнесен по множеству машин. Соответственно, для того чтобы система очередей сообщений могла перемещать сообщения, она должна поддерживать отображение очередей на сетевые адреса. На практике это означает, что она должна поддерживать базу данных (возможно, распределенную) имен очередей {queue names) в соответствии с их сетевым местоположением, как показано на рис. 2.24. Отметим, что это отображение полностью анало-
2.4. Связь посредством сообщений 139
г ично использованию системы доменных имен (DNS) для электронной почты Интернета. Так, например, для отсылки почты на логический почтовый адрес steen@cs.vu.nl почтовая система запрашивает у DNS сетевой адрес (то есть IP-адрес) почтового сервера получателя, чтобы затем использовать его для передачи сообщений.
Очереди управляются менеджерами очередей (queue managers). Обычно менеджер очередей взаимодействует непосредственно с отправляющими и принимающими сообщения приложениями. Существуют, однако, и специализированные менеджеры очередей, которые работают как маршрутизаторы, или ретрансляторы: они перенаправляют приходящие сообщения другим менеджерам очередей. Таким образом, система очередей сообщений может постепенно вырасти до законченной оверлейной сети (overlay network) прикладного уровня поверх существующей компьютерной сети. Этот подход схож с ранней конструкцией системы МВоnе поверх Интернета, в которой обычные пользовательские процессы конфигурировались для маршрутизации групповых рассылок. В наши дни многие маршрутизаторы сами поддерживают групповые рассылки и необходимость в оверлейных групповых рассылках сильно сократилась.
Ретрансляторы могут быть удобны по нескольким причинам. Так, во многих системах очередей сообщений не существует общих служб именования, которые могли бы динамически поддерживать отображение имен на адреса. Вместо этого топология сети с очередями сделана статической, а каждый менеджер очередей имеет копию отображения очередей на адреса. Нельзя не сказать, что в крупномасштабных системах очередей сообщений подобный подход легко может привести к трудностям в управлении сетью.
Одним из решений этой проблемы является использование нескольких маршрутизаторов, имеющих информацию о топологии сети. Когда отправитель А помещает в локальную очередь сообщение для получателя В, это сообщение первым делом передается на ближайший маршрутизатор R1, как показано на рис. 2.25. При этом маршрутизатор знает, что делать с этим сообщением, и передает его в направлении В. Так, R1 может понять по имени В, что сообщение следует передать на маршрутизатор R2. Таким образом, при добавлении или удалении очере-