Что такое буферизация сообщений?

Опубликовано: 17 Сентября, 2022

Удаленный вызов процедур (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

Семантика:

  1. Блокирующий/неблокирующий: блокирующий send() останавливает процесс и ждет, пока сообщение не будет отправлено и буфер сообщений не будет очищен, прежде чем продолжить. С другой стороны, блокирующий прием блокируется в функции receive() до тех пор, пока не придет сообщение. Неблокирующая отправка быстро возвращает управление вызывающей стороне. Затем процесс передачи сообщения выполняется параллельно с фазой отправки.
  2. Буферизованные/небуферизованные сообщения: Небуферизованный прием () означает, что вместо использования буфера сообщений процесс-отправитель немедленно отправляет сообщение процессу-получателю. Адрес получателя в send() — это адрес процесса; однако в буферизованной функции send() адрес является адресом буфера.
  3. Надежная/ненадежная отправка: ненадежная отправка() передает сообщение получателю, не ожидая его подтверждения, и не выполняет автоматическую повторную передачу сообщения для обеспечения получения. Надежная функция send() гарантирует, что сообщение будет получено к моменту завершения функции send().
  4. Прямая/непрямая связь: Использование портов позволяет осуществлять непрямую связь. Передатчик отправляет сообщения в порт, а приемник принимает их из порта. Вместо того, чтобы отправлять сообщение на промежуточный порт, сообщение отправляется непосредственно процессу, который конкретно идентифицируется в параметрах отправки и получения в случае прямой связи.
  5. Сообщения фиксированного/переменного размера. Размер сообщений фиксированного размера ограничен системой. Сообщения переменного размера сложнее создавать, но они упрощают программирование; обратное верно для сообщений фиксированного размера.

Типы сообщений:

В реализации RPC используются два типа сообщений:

  1. Сообщения о вызовах
  2. Ответить на сообщения

1. Сообщения о вызовах:

Клиент отправляет сообщение вызова на сервер, чтобы можно было выполнить удаленную процедуру.

Формат:

  1. Идентификатор удаленной процедуры: в этом поле содержится информация об удаленной процедуре, которая должна быть выполнена.
  2. Аргументы: аргументы, необходимые для выполнения процедуры.
  3. Идентификация сообщения: это поле используется для идентификации потерянных и дублированных сообщений с помощью порядкового номера.
  4. Тип сообщения: Это поле используется для идентификации типа сообщения, т.е. относится ли сообщение к типу сообщения вызова или типу сообщения ответа.
  5. Идентификация клиента: это поле позволяет серверу идентифицировать клиента, а также аутентифицировать клиентский процесс.

Формат сообщения вызова RPC:

Идентификатор удаленной процедуры
Идентификатор сообщения Тип сообщения Идентификатор клиента Номер программы Номер версии Номер процедуры Аргументы

2. Ответить на сообщения:

Сервер возвращает результат удаленного выполнения процедуры клиенту с помощью ответного сообщения. Существует две формы ответных сообщений: успешные сообщения и неудачные сообщения.

A. Сообщение об успешном ответе: если конкретная удаленная процедура выполнена успешно.

Формат:

Message Identifier     Message Type     Reply Status (0) - Successful     Result

B. Неудачное сообщение. Если возникает какое-либо из следующих условий, сообщение относится к неудачному типу:

  1. Сервер идентифицирует, сканируя поле идентификатора клиента, что клиент не авторизован для использования службы.
  2. Идентификатор отсутствует.
  3. Если сервер не находит никакой информации в полях номера программы, номера версии или номера процедуры.
  4. Во время выполнения удаленной процедуры возникает исключительная ситуация.
  5. Если сервер не может декодировать данные аргументы.
  6. Сервер обнаруживает, что сообщение о вызове не соответствует ему.

Формат:

Message Identifier     Message Type     Reply Status (1) - Unsuccessful     Reason for failure

Буферизация сообщений

Буферизация подразумевает постановку в очередь отправки или получения сообщений во время передачи от одного процесса к другому. Буфер — это область временного хранения, используемая для хранения сообщения до тех пор, пока принимающий процесс не будет готов принять сообщение. чтобы его можно было восстановить позже. Ниже приведены механизмы буферизации в зависимости от синхронных и асинхронных систем:

1. Синхронные системы

Эти системы могут не иметь буфера или отдельного буфера сообщений.

Нулевой буфер или отсутствие буфера:

В стратегии без буфера для хранения сообщений не используется временное хранилище. Используется в асинхронном режиме связи. В этой стратегии используются два подхода: сообщение остается в адресном пространстве отправителя, т.е. отправка задерживается до тех пор, пока получатель не выполнит примитив Receive() после завершения текущего приема. Другой, сообщение будет отброшено, а затем будет повторно отправлено через определенный период, который установлен.

Буфер одиночного сообщения:

В механизме буфера одиночного сообщения поддерживается буфер для хранения только одного сообщения на стороне получателя. Сообщение будет помещено в буфер только в том случае, если получатель не готов принять сообщение. Расположение буфера может быть либо в адресном пространстве ядра, либо на принимающей стороне в адресном пространстве процесса получателя. Используется в синхронном режиме связи.

2. Асинхронные системы:

Эти системы могут иметь буфер неограниченной емкости или ограниченное количество связанных сообщений (буфер нескольких сообщений).

Буфер неограниченной емкости:

В этой стратегии отправителю не нужно ждать отправки сообщений, если на принимающей стороне получатель не готов принять сообщения. Неограниченная емкость означает, что все сообщения, полученные от отправителя, будут храниться и гарантировать, что они будут доставлены получателю. Используется в асинхронном режиме связи.

Конечный буфер (буфер для нескольких сообщений):

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

  1. Неудачная связь: Примитив send() возвращает сообщение об ошибке отправляющему процессу, т. е. связь не удалась, поскольку сообщение не было доставлено по назначению. Он менее надежен.
  2. Связь с управлением потоком: здесь используется стратегия управления потоком, при которой отправитель остается заблокированным до тех пор, пока получатель не начнет принимать некоторые сообщения, так что в буфере создается место для новых сообщений. Эта стратегия исключает асинхронный режим связи, блокируя отправителя, что приводит к неожиданным взаимоблокировкам.

Распределение буферного пространства зависит от реализации. На принимающей стороне получатель хранит сообщения в почтовом ящике, расположенном либо в адресном пространстве ядра, либо на принимающей стороне в адресном пространстве процесса получателя.