Введение
В архитектуре программного обеспечения, шаблон обмена сообщениями — это архитектурный шаблон, описывающий способ соединения и взаимодействия двух различных частей приложения или разных систем. Концепция обмена сообщениями имеет множество аспектов, которые можно разделить на следующие категории: обмен сообщениями с аппаратными устройствами (телекоммуникации, компьютерные сети, Интернет вещей и т. д.) и программный обмен данными (различные форматы обмена данными и программные возможности для такого обмена). Несмотря на разницу в контексте, обе категории демонстрируют общие характеристики обмена данными.
Общие понятия модели передачи сообщений
В телекоммуникациях схема обмена сообщениями (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").
In Only: This is equivalent to one way. A standard one way messaging exchange where the consumer sends a message to the provider that provides do not send any type of response. Robust In Only: This pattern is for reliable one way message exchanges. The consumer initiates with a message to which the provider responds with status. If the response is a status, the exchange is complete, but if the response is a fault, the consumer must respond with a status. In Out: This is equivalent to request–response. A standard two way message exchange where the consumer initiates with a message, the provider responds with a message or fault and the consumer responds with a status. In Optional Out: A standard two way message exchange where the provider's response is optional. Out Only: The reverse of In Only. It primarily supports event notification. It cannot trigger a fault message. Robust Out Only: Similar to the out only pattern, except it can trigger a fault message. The outbound message initiates the transmission. Out In: The reverse of In Out. The provider transmits the request and initiates the exchange. Out Optional In: The reverse of In Optional Out. The service produces an outbound message. The incoming message is optional ("Optional in").
ØMQ
Библиотека очередей сообщений ØMQ предоставляет так называемые сокеты (своего рода обобщение традиционных IP и Unix-сокетов), которым требуется указание используемого шаблона обмена сообщениями и которые оптимизированы для каждого шаблона. Основные шаблоны ØMQ:
Запрос-ответ соединяет множество клиентов с множеством сервисов. Это шаблон удаленного вызова процедур и распределения задач. Издатель-подписчик соединяет множество издателей с множеством подписчиков. Это шаблон распространения данных. Push-pull соединяет узлы в схеме "рассылка-сбор", которая может иметь несколько этапов и циклов. Это шаблон параллельного распределения и сбора задач. Эксклюзивная пара соединяет два сокета в эксклюзивную пару. Это низкоуровневый шаблон для специфических, продвинутых сценариев использования. Каждый шаблон определяет определенную сетевую топологию. Запрос-ответ определяет так называемую "сервисную шину", издатель-подписчик определяет "дерево распространения данных", push-pull определяет "параллельный конвейер". Все шаблоны намеренно разработаны таким образом, чтобы быть бесконечно масштабируемыми и, следовательно, пригодными для использования в масштабах Интернета.
Request–reply connects a set of clients to a set of services. This is a remote procedure call and task distribution pattern. Publish–subscribe connects a set of publishers to a set of subscribers. This is a data distribution pattern. Push–pull connects nodes in a fan out / fan in pattern that can have multiple steps, and loops. This is a parallel task distribution and collection pattern. Exclusive pair connects two sockets in an exclusive pair. This is a low level pattern for specific, advanced use cases. Each pattern defines a particular network topology. Request reply defines so called "service bus", publish subscribe defines "data distribution tree", push pull defines "parallelised pipeline". All the patterns are deliberately designed in such a way as to be infinitely scalable and thus usable on Internet scale.
Остаток
Протокол REST – это протокол обмена сообщениями, построенный на основе протокола HTTP и, подобно ему, использующий модель запрос-ответ для обмена сообщениями. В то время как основная задача HTTP – доставка веб-страниц и файлов через Интернет конечному пользователю, протокол REST в основном используется для взаимодействия между различными программными системами и играет ключевую роль в архитектуре микросервисов. Важным свойством протокола REST является его универсальность в представлении данных в различных форматах (как правило, JSON и XML), а также предоставление дополнительных метаданных для описания сообщения. Эти метаданные соответствуют стандартам HTTP и представляются в виде HTTP-заголовков (стандартизированных базовым протоколом HTTP), что позволяет использовать их как инструкции для получателя относительно интерпретации содержимого сообщения. Благодаря этому REST значительно упрощает разработку программных систем, способных взаимодействовать друг с другом, поскольку разработчикам необходимо учитывать только формат данных высокого уровня (модель JSON или XML). Непосредственная HTTP-коммуникация обычно обрабатывается программной библиотекой или фреймворком. Еще одним важным преимуществом протокола REST является возможность построения других протокольных семантик на его основе, примером чего является HATEOAS.