Введение

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

Общие понятия модели передачи сообщений

В телекоммуникациях схема обмена сообщениями (MEP) описывает последовательность сообщений, необходимую коммуникационному протоколу для установления или использования канала связи. Коммуникационный протокол – это формат, используемый для представления сообщения, на котором договариваются (или который способны обработать) все взаимодействующие стороны. Канал связи – это инфраструктура, обеспечивающая "передачу" сообщений между взаимодействующими сторонами. Схемы обмена сообщениями описывают поток сообщений между сторонами в процессе коммуникации. Существуют две основные схемы обмена сообщениями – схема запрос-ответ и односторонняя схема. Например, при просмотре контента в Интернете (канале), веб-браузер (взаимодействующая сторона) использует HTTP (коммуникационный протокол) для запроса веб-страницы с сервера (другой взаимодействующей стороны), а затем отображает полученные данные в визуальной форме. Так работает схема обмена сообщениями запрос-ответ. В качестве альтернативы, в компьютерных сетях используется сетевой протокол UDP. Он применяется с односторонней схемой передачи сообщений, где отправитель не заинтересован в том, достигло ли сообщение какой-либо принимающей стороны, и не ожидает от принимающих сторон "ответного" сообщения.

Связь с устройством

Этот раздел посвящен обмену данными между аппаратными устройствами. Чтобы устройства могли считывать и обмениваться данными, они используют специализированный аппаратный протокол (например, радиосигнал), генерируемый аппаратным устройством, выступающим в роли отправителя (например, радиовышкой), который может быть интерпретирован другим аппаратным устройством, выступающим в роли получателя (например, вашим кухонным радиоприемником). На примере радио мы видим одностороннюю схему связи, где сам радиосигнал является протоколом обмена сообщениями. Коммуникация между устройствами также может относиться к способу, которым аппаратные устройства в системе обмена сообщениями обеспечивают этот обмен. Например, при просмотре веб-страниц множество различных устройств работают согласованно, чтобы доставить сообщение через интернет-трафик – маршрутизаторы, коммутаторы и сетевые адаптеры, которые на аппаратном уровне отправляют и принимают сигналы в виде пакетов TCP или UDP. Каждый такой пакет можно рассматривать как сообщение, если мы фокусируемся на паре взаимодействующих аппаратных устройств, однако в контексте общей интернет-коммуникации, последовательность пакетов формирует осмысленное сообщение, такое как изображение или веб-страница.

Сообщение с программным обеспечением

В отличие от коммуникаций между устройствами, где форма данных сообщения ограничена протоколами, поддерживаемыми типом и возможностями задействованных устройств (например, в компьютерных сетях используются протоколы TCP и UDP, рация передает радиоволны на определенной частоте, а маяк подает сигналы кодом Морзе, который может прочитать человек), программное обеспечение способно устанавливать более сложные и надежные форматы обмена данными. Эти форматы преобразуются отправляющей стороной в формат, передаваемый базовым оборудованием, а затем принимающей стороной декодируются из формата, специфичного для оборудования, в формат, соответствующий исходному протоколу, установленному взаимодействующими программными системами. Такой обмен данными более высокого уровня позволяет передавать информацию в более удобном для чтения виде, а также использовать программные методы шифрования и дешифрования для обеспечения безопасности сообщений. Кроме того, программный обмен сообщениями предоставляет больше вариантов моделей обмена, не ограничиваясь простыми запросами-ответами и односторонними подходами. И, наконец, программные системы связи способны обеспечивать различные каналы для обмена данными, которые можно использовать для оптимизации доставки сообщений или для установления сложных правил отбора и фильтрации, определяющих, какие стороны должны получать определенные сообщения. Это позволяет реализовать программно-управляемую маршрутизацию сообщений. В результате этого появились понятия темы (когда все принимающие стороны в целевой группе получают копию сообщения) и очереди (когда сообщение получает только одна сторона в целевой группе). Как упоминалось ранее, программный обмен сообщениями предоставляет больше возможностей и свободы в протоколах обмена данными. Однако это не будет полезно, если взаимодействующие стороны не договорятся о деталях протокола, поэтому существует ряд стандартизированных программных протоколов обмена сообщениями. Эта стандартизация позволяет различным программным системам, обычно разрабатываемым и поддерживаемым разными организациями и работающим на различных аппаратных устройствах (серверах, компьютерах, смарт-устройствах или контроллерах IoT), участвовать в обмене данными в реальном времени. Ниже приведен список некоторых из наиболее популярных программных протоколов обмена сообщениями, которые до сих пор используются. Каждый из них расширяет концепцию обмена сообщениями, описанную в предыдущем разделе.

МОЛО

Термин "образец обмена сообщениями" имеет расширенное значение в протоколе простого доступа к объектам (SOAP). Типы SOAP MEP включают:
Только ввод (In Only): Это эквивалентно одностороннему обмену. Стандартный односторонний обмен сообщениями, при котором потребитель отправляет сообщение поставщику, который не отправляет никакого ответа. Надежный ввод (Robust In Only): Этот образец предназначен для надежного одностороннего обмена сообщениями. Потребитель инициирует обмен сообщением, на которое поставщик отвечает статусом. Если ответ – это статус, обмен завершен, но если ответ – это ошибка, потребитель должен ответить статусом. Ввод-вывод (In Out): Это эквивалентно запросу-ответу. Стандартный двусторонний обмен сообщениями, при котором потребитель инициирует обмен сообщением, поставщик отвечает сообщением или ошибкой, а потребитель отвечает статусом. Ввод с необязательным выводом (In Optional Out): Стандартный двусторонний обмен сообщениями, в котором ответ поставщика является необязательным. Только вывод (Out Only): Обратный вариант "Только ввод". В основном используется для уведомления о событиях. Не может вызвать сообщение об ошибке. Надежный вывод (Robust Out Only): Аналогичен образцу "Только вывод", за исключением того, что он может вызвать сообщение об ошибке. Исходящее сообщение инициирует передачу. Вывод-ввод (Out In): Обратный вариант "Ввод-вывод". Поставщик передает запрос и инициирует обмен. Вывод с необязательным вводом (Out Optional In): Обратный вариант "Ввод с необязательным выводом". Служба создает исходящее сообщение. Входящее сообщение является необязательным ("Optional in").

ØMQ

Библиотека очередей сообщений ØMQ предоставляет так называемые сокеты (своего рода обобщение традиционных IP и Unix-сокетов), которым требуется указание используемого шаблона обмена сообщениями и которые оптимизированы для каждого шаблона. Основные шаблоны ØMQ:
Запрос-ответ соединяет множество клиентов с множеством сервисов. Это шаблон удаленного вызова процедур и распределения задач. Издатель-подписчик соединяет множество издателей с множеством подписчиков. Это шаблон распространения данных. Push-pull соединяет узлы в схеме "рассылка-сбор", которая может иметь несколько этапов и циклов. Это шаблон параллельного распределения и сбора задач. Эксклюзивная пара соединяет два сокета в эксклюзивную пару. Это низкоуровневый шаблон для специфических, продвинутых сценариев использования. Каждый шаблон определяет определенную сетевую топологию. Запрос-ответ определяет так называемую "сервисную шину", издатель-подписчик определяет "дерево распространения данных", push-pull определяет "параллельный конвейер". Все шаблоны намеренно разработаны таким образом, чтобы быть бесконечно масштабируемыми и, следовательно, пригодными для использования в масштабах Интернета.

Остаток

Протокол REST – это протокол обмена сообщениями, построенный на основе протокола HTTP и, подобно ему, использующий модель запрос-ответ для обмена сообщениями. В то время как основная задача HTTP – доставка веб-страниц и файлов через Интернет конечному пользователю, протокол REST в основном используется для взаимодействия между различными программными системами и играет ключевую роль в архитектуре микросервисов. Важным свойством протокола REST является его универсальность в представлении данных в различных форматах (как правило, JSON и XML), а также предоставление дополнительных метаданных для описания сообщения. Эти метаданные соответствуют стандартам HTTP и представляются в виде HTTP-заголовков (стандартизированных базовым протоколом HTTP), что позволяет использовать их как инструкции для получателя относительно интерпретации содержимого сообщения. Благодаря этому REST значительно упрощает разработку программных систем, способных взаимодействовать друг с другом, поскольку разработчикам необходимо учитывать только формат данных высокого уровня (модель JSON или XML). Непосредственная HTTP-коммуникация обычно обрабатывается программной библиотекой или фреймворком. Еще одним важным преимуществом протокола REST является возможность построения других протокольных семантик на его основе, примером чего является HATEOAS.