Что такое буферизация сообщений?
Удаленный вызов процедур (RPC) — это технология связи, которая используется одной программой для отправки запроса другой программе на использование ее службы в сети, даже не зная сведений о сети.
Межпроцессное взаимодействие в распределенных системах осуществляется с помощью передачи сообщений. Он позволяет обмениваться сообщениями между процессами, используя примитивы для отправки и получения сообщений. Программист должен понимать сообщение, а также имена исходного и целевого процессов. Примитив send() используется процессом для отправки сообщений, а примитив Receive() используется процессом для получения сообщений.
Сообщения RPC:
В распределенных системах связь между процессами осуществляется путем передачи сообщений от одного процесса к другому. Передача сообщений находится на самом низком уровне абстракции, тогда как RPC представляет собой более высокую абстракцию. Из-за самого низкого уровня абстракции требуется, чтобы программист приложения мог идентифицировать сообщение, процесс-источник, процесс-получатель и типы данных, вероятные из задействованных процессов.
Синтаксис: Синтаксис, используемый при передаче сообщений для примитивов send() и receive(), следующий:
send (receiver, message) // requires the name of the destination process and the message data as arguments receive(sender, message) // requires the name of the sender process and the message data as arguments
Семантика:
- Блокирующий/неблокирующий: блокирующий send() останавливает процесс и ждет, пока сообщение не будет отправлено и буфер сообщений не будет очищен, прежде чем продолжить. С другой стороны, блокирующий прием блокируется в функции receive() до тех пор, пока не придет сообщение. Неблокирующая отправка быстро возвращает управление вызывающей стороне. Затем процесс передачи сообщения выполняется параллельно с фазой отправки.
- Буферизованные/небуферизованные сообщения: Небуферизованный прием () означает, что вместо использования буфера сообщений процесс-отправитель немедленно отправляет сообщение процессу-получателю. Адрес получателя в send() — это адрес процесса; однако в буферизованной функции send() адрес является адресом буфера.
- Надежная/ненадежная отправка: ненадежная отправка() передает сообщение получателю, не ожидая его подтверждения, и не выполняет автоматическую повторную передачу сообщения для обеспечения получения. Надежная функция send() гарантирует, что сообщение будет получено к моменту завершения функции send().
- Прямая/непрямая связь: Использование портов позволяет осуществлять непрямую связь. Передатчик отправляет сообщения в порт, а приемник принимает их из порта. Вместо того, чтобы отправлять сообщение на промежуточный порт, сообщение отправляется непосредственно процессу, который конкретно идентифицируется в параметрах отправки и получения в случае прямой связи.
- Сообщения фиксированного/переменного размера. Размер сообщений фиксированного размера ограничен системой. Сообщения переменного размера сложнее создавать, но они упрощают программирование; обратное верно для сообщений фиксированного размера.
Типы сообщений:
В реализации RPC используются два типа сообщений:
- Сообщения о вызовах
- Ответить на сообщения
1. Сообщения о вызовах:
Клиент отправляет сообщение вызова на сервер, чтобы можно было выполнить удаленную процедуру.
Формат:
- Идентификатор удаленной процедуры: в этом поле содержится информация об удаленной процедуре, которая должна быть выполнена.
- Аргументы: аргументы, необходимые для выполнения процедуры.
- Идентификация сообщения: это поле используется для идентификации потерянных и дублированных сообщений с помощью порядкового номера.
- Тип сообщения: Это поле используется для идентификации типа сообщения, т.е. относится ли сообщение к типу сообщения вызова или типу сообщения ответа.
- Идентификация клиента: это поле позволяет серверу идентифицировать клиента, а также аутентифицировать клиентский процесс.
Формат сообщения вызова RPC:
Идентификатор удаленной процедуры | ||||||
---|---|---|---|---|---|---|
Идентификатор сообщения | Тип сообщения | Идентификатор клиента | Номер программы | Номер версии | Номер процедуры | Аргументы |
2. Ответить на сообщения:
Сервер возвращает результат удаленного выполнения процедуры клиенту с помощью ответного сообщения. Существует две формы ответных сообщений: успешные сообщения и неудачные сообщения.
A. Сообщение об успешном ответе: если конкретная удаленная процедура выполнена успешно.
Формат:
Message Identifier Message Type Reply Status (0) - Successful Result
B. Неудачное сообщение. Если возникает какое-либо из следующих условий, сообщение относится к неудачному типу:
- Сервер идентифицирует, сканируя поле идентификатора клиента, что клиент не авторизован для использования службы.
- Идентификатор отсутствует.
- Если сервер не находит никакой информации в полях номера программы, номера версии или номера процедуры.
- Во время выполнения удаленной процедуры возникает исключительная ситуация.
- Если сервер не может декодировать данные аргументы.
- Сервер обнаруживает, что сообщение о вызове не соответствует ему.
Формат:
Message Identifier Message Type Reply Status (1) - Unsuccessful Reason for failure
Буферизация сообщений
Буферизация подразумевает постановку в очередь отправки или получения сообщений во время передачи от одного процесса к другому. Буфер — это область временного хранения, используемая для хранения сообщения до тех пор, пока принимающий процесс не будет готов принять сообщение. чтобы его можно было восстановить позже. Ниже приведены механизмы буферизации в зависимости от синхронных и асинхронных систем:
1. Синхронные системы
Эти системы могут не иметь буфера или отдельного буфера сообщений.
Нулевой буфер или отсутствие буфера:
В стратегии без буфера для хранения сообщений не используется временное хранилище. Используется в асинхронном режиме связи. В этой стратегии используются два подхода: сообщение остается в адресном пространстве отправителя, т.е. отправка задерживается до тех пор, пока получатель не выполнит примитив Receive() после завершения текущего приема. Другой, сообщение будет отброшено, а затем будет повторно отправлено через определенный период, который установлен.
Буфер одиночного сообщения:
В механизме буфера одиночного сообщения поддерживается буфер для хранения только одного сообщения на стороне получателя. Сообщение будет помещено в буфер только в том случае, если получатель не готов принять сообщение. Расположение буфера может быть либо в адресном пространстве ядра, либо на принимающей стороне в адресном пространстве процесса получателя. Используется в синхронном режиме связи.
2. Асинхронные системы:
Эти системы могут иметь буфер неограниченной емкости или ограниченное количество связанных сообщений (буфер нескольких сообщений).
Буфер неограниченной емкости:
В этой стратегии отправителю не нужно ждать отправки сообщений, если на принимающей стороне получатель не готов принять сообщения. Неограниченная емкость означает, что все сообщения, полученные от отправителя, будут храниться и гарантировать, что они будут доставлены получателю. Используется в асинхронном режиме связи.
Конечный буфер (буфер для нескольких сообщений):
В буфере с конечной привязкой этот механизм используется для решения проблемы переполнения буфера. Используется в асинхронном режиме связи. Выделенное буферное пространство зависит от реализации. Ниже приведены два способа решения этой проблемы переполнения:
- Неудачная связь: Примитив send() возвращает сообщение об ошибке отправляющему процессу, т. е. связь не удалась, поскольку сообщение не было доставлено по назначению. Он менее надежен.
- Связь с управлением потоком: здесь используется стратегия управления потоком, при которой отправитель остается заблокированным до тех пор, пока получатель не начнет принимать некоторые сообщения, так что в буфере создается место для новых сообщений. Эта стратегия исключает асинхронный режим связи, блокируя отправителя, что приводит к неожиданным взаимоблокировкам.
Распределение буферного пространства зависит от реализации. На принимающей стороне получатель хранит сообщения в почтовом ящике, расположенном либо в адресном пространстве ядра, либо на принимающей стороне в адресном пространстве процесса получателя.