Web Application Messaging Protocol


WAMP — подпротокол протокола WebSocket, зарегистрированный в IANA, созданный чтобы обеспечить взаимосвязь двух шаблонов проектирования RPC и PubSub. Его цель — обеспечить открытый стандарт для программного обмена сообщениями в реальном времени между компонентами приложения и упростить создание слабо связанных архитектур на основе микросервисов. Поэтому данный подпротокол является подходящим для сервисной шины предприятия (ESB), пригодной для разработки адаптивных веб-приложений или для координации нескольких подключенных устройств в IoT.

Характеристики

Структура

WAMP требует надежный, упорядоченный, дуплексный канал сообщений в качестве способа связи на транспортном уровне, и по умолчанию использует Websocket. Однако реализации могут использовать другие способы связи на транспортном уровне, соответствующие этим характеристикам, и связываться с программным обеспечением WAMP, например, с помощью «сырых» сокетов, сокетов домена Unix или регулярных pull-запросов.

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

Чтобы определить удаленные процедуры и разделы PubSub без конфликтов, WAMP также необходимо пространство идентификаторов, позволяющее глобальное назначение и изменение. Поскольку протокол является web native — WebSocket является предпочтительным транспортным протоколом — в данном случае используются URI.

Принцип работы

WAMP имеет структуру взаимодействия «клиент-клиент», с централизированным программным обеспечением, маршрутизатором, посылающим сообщения клиентами. Типичный рабочий процесс обмена данными:

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

Клиенты отправляют эти сообщения с помощью технологий более высокого уровня: RPC и PUB / SUB, выполняющих четыре основных взаимодействия:

  • регистрация: клиент предоставляет процедуру для удаленного вызова.
  • вызов: клиент запрашивает у маршрутизатора результаты открытой процедуры другого клиента.
  • подписка: клиент уведомляет о своей заинтересованности в теме.
  • публикация: клиент публикует сведения об этой теме.

Обмен данных может иметь другой вид, в зависимости от выбранного протокола транспортного уровня. Однако детали реализации скрыты для конечного пользователя, который взаимодействует только с двумя высокоуровневыми шаблонами проектирования — RPC и PubSub.

Безопасность

Поскольку WAMP использует протокол Websocket, соединения могут использовать TLS для шифрования. Для случаев, когда полная конфиденциальность не установлена, предусмотрена реализация нескольких механизмов для изоляции компонентов и предотвращения атак типа «человек посередине». Реализации под протокола по умолчанию гарантируют, что попытка зарегистрировать уже зарегистрированную процедуру не удастся.

Маршрутизаторы могут определять области как административные домены, а клиенты должны указать, под какой областью они хотят подключиться к соединению. После подключения область будет действовать как пространство имен, не позволяя клиентам, подключенным к области, использовать идентификаторы, определенные в другом для RPC и PubSub. Области также имеют прикрепленные разрешения и могут ограничить клиентов одним подмножеством доступных действий REGISTER / CALL / PubSub.

К некоторым областям могут подсоединяться только аутентифицированные клиенты, используя различные методы аутентификации, такие как использование сертификата TLS , куки или «simple ticket».

Маршрутизация в RPC

В отличие от традиционных RPC, которые обращены непосредственно от вызывающего к сущности, предлагающей процедуру (как правило, бэкенд сервера) и строго однонаправленные (клиент-сервер), RPC в WAMP маршрутизируются промежуточным программным обеспечением и работают в двунаправленном режиме.

Регистрация RPC выполняется с маршрутизатором WAMP, а вызовы процедур аналогичным образом выдаются маршрутизатору WAMP. Это означает, в первую очередь, что клиент может выдавать все RPC через одно соединение с WAMP-маршрутизатором и не нуждается в том, чтобы знать, какой клиент в настоящее время предлагает эту процедуру, где находится этот клиент или как его определить. Регистрация RPC действительно может меняться между вызовами, открывая возможность для расширенных функций, таких как балансировка нагрузки или отказ при вызове процедур.

Кроме того, это означает, что все клиенты WAMP равны в том, что они могут предлагать процедуры для вызова. Это позволяет избежать традиционного различия между клиентами и серверными бэкэндами и позволяет архитектурам, где клиенты браузера вызывают процедуры для других клиентов браузера, использовать API как будто с одноранговой связью

Однако даже при многоуровневой архитектуре маршрутизатор по-прежнему остается единственной точкой отказа. По этой причине некоторые карты маршрутов маршрутизатора включают функции кластеризации.

Реализации

Клиенты

Поскольку основными задачами WAMP являются веб-приложения и интернетные приложения, реализация клиентов осуществлена на языках, которые хорошо зарекомендовали себя в этих отраслях (перечислены только клиенты WAMP v2):

Минимальные требования к созданию WAMP-клиента — это возможность использовать сокеты и сериализацию JSON. Таким образом, многие современные языки уже выполняют эти требования, использую стандартные библиотеки. Дополнительные функции, которые добавили бы зависимости в проект, такие как шифрование TLS или сериализация MessagePack, являются необязательными.

Однако, постоянный характер соединений WebSocket требует использования библиотек, защищенных от блокировок, и асинхронных API. На языках с одним официальным механизмом, таким как JavaScript, Erlang или Go, это не проблема. Но языки с несколькими конкурирующими решениями для асинхронного программирования, такие как Python или PHP, заставляют автора клиента фиксировать определенную часть экосистемы.

По этой же причине интеграция устаревших проектов также может потребовать работы. В качестве примера, большинство популярных фреймворков Web Python использующих WSGI, синхронный API и запускающих клиента WAMP внутри рабочего пользователя WSGI, нуждаются в ручных адаптерах, таких как crochet.

Маршрутизаторы

Хотя маршрутизаторы могут быть встроены непосредственно в код приложения, а некоторые клиентские библиотеки также предоставляют маршрутизатор, эта архитектура не приветствуется спецификацией.

Поскольку маршрутизатор является движущейся частью, он лучше всего используется в качестве заменяемого черного ящика, также как Apache или Nginx для HTTP:

Tavendo, компания, из которой возник протокол, также является автором Crossbar.io, который продвигает себя как де-факто-реализацию маршрутизатора. Поскольку они продвигают архитектуры на основе микросервиса, Crossbar.io внедряет диспетчер служб для размещения и мониторинга компонентов приложения WAMP, статического веб-сервера файлов и контейнера WSGI. Будучи написано с помощью библиотеки Twisted, это одна из реализаций, которые могут быть созданы в производстве без прокси, с целью замены стеков, таких как Nginx, связанных с Supervisor и Gunicorn.

Применение

Будучи подпротоколом WebSocket, WAMP идеально подходит для использования в качестве «сырых» веб-сокетов, как способ синхронизации таких клиентов, как веб-браузеры, push-уведомления и возможность мягкой совместной работы в режиме реального времени между пользователями. Он также имеет те же ограничения, которые требуются для поддержки клиентов, которые отсутствуют для версий Internet Explorer старше 10. Это смягчается наличием полизаполнений с использованием более переносимых технологий, таких как Flash или использование HTTP Longpoll в качестве резервной копии. В этом смысле WAMP является конкурентом DDP Meteor.

WAMP также нацелен на IoT, где он используется так же, как MQTT, как легкий и эффективный носитель для организации кластеров связанных объектов. Реализации на разных языках делают его подходящим для контроля и мониторинга небольших устройств, таких как Raspberry Pi (в Python) или Tessel (в JavaScript).

И последнее, но не менее важное: WAMP может выступать в качестве служебной шины предприятия, служащей связующим звеном между микросервисами, такими как CORBA, ZeroMQ, Apache Thrift, SOAP или AMQP.

Перспективы

WAMP в настоящее время находится в версии 2, которая вводит маршрутизируемый RPC. Версия 1 теперь устарела. На данный момент все маршрутизаторы совместимы с версией 2. Некоторые клиенты остаются непортированными: Wamp.io, AutobahnAndroid и cljWAMP.

Версия 2 спецификации разделена на две части: базовый профиль, включая RPC маршрутизатора и Pub / Sub, и расширенный профиль с указанием уровней доверия, сопоставления шаблонов URI и перечисления клиентов. Базовый профиль считается стабильным и реализуется в текущих библиотеках, пока расширенный профиль все еще находится в процессе эволюции.



Имя:*
E-Mail:
Комментарий: