Протокол обмена сообщениями веб-приложений - Web Application Messaging Protocol

ВАМП это WebSocket подпротокол, зарегистрированный на IANA,[1] указан[2] предлагать маршрутизированный RPC и PubSub. Его цель дизайна[3] должен обеспечить открытый стандарт для мягкого обмена сообщениями в реальном времени между компонентами приложения и упростить создание слабо связанный архитектуры на основе микросервисы. Из-за этого это подходящий служебная шина предприятия (ESB),[4] подходит для разработки адаптивных веб-приложений или для координации нескольких подключенных устройств в Интернет вещей.[5]

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

Структура

WAMP требует[6] надежный, заказанный, полнодуплексный канал сообщений как транспортный уровень, и по умолчанию использует Websocket. Однако реализации могут использовать другие транспорты, соответствующие этим характеристикам, и взаимодействовать с WAMP, например, через сырые сокеты,[7] Сокеты Unix или же HTTP длинный опрос.

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

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

Рабочий процесс

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

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

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

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

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

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

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

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

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

Маршрутизированные RPC

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

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

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

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

Реализации

Клиенты

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

Клиентская библиотекаЯзык
AngularWAMPJavaScript для AngularJS рамки
АвтобанCppC ++ 11
АвтобанJSJavaScript (браузер и Node.js )
АвтобанПайтонPython
тупойPython
Сеть :: WAMPPerl
backbone.WAMPJavaScript для Backbone.js библиотека
CppWAMPC ++ 11
ЭрваErlang
ДжавампаЯва
LoowyLua
MDWampЦель-C
МиньонPHP
rx.wampJavaScript для Реагировать библиотека
ThruwayPHP
ВАМП ПОКОC ++
WampSharpC #
Wampy.jsJavaScript (только браузер)
связьИдти

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

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

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

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

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

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

МаршрутизаторЯзык
БондиErlang
Crossbar.ioPython (CPython и PyPy )
ЭрваErlang
ДжавампаЯва
ThruwayPHP
wamp.rtJavaScript (только для Node.js)
WampSharpC #
WiolaLua
Ночная жизнь-кроликJavaScript (только для Node.js)
связьИдти

Тавендо, компания, из которой был составлен протокол, также является автором Crossbar.io, который позиционирует себя как де-факто реализация маршрутизатора.[14] Поскольку они продвигают архитектуры на основе микросервисов, Crossbar.io встраивает диспетчер служб для размещения и мониторинга компонентов приложения WAMP, статический файловый веб-сервер и контейнер WSGI. Написано с Скрученный библиотека, это одна из реализаций, которые можно настроить в производственной среде без прокси-сервера, с целью заменить стеки, такие как Nginx, связанные с Руководитель и Gunicorn.

Сценарии использования

Будучи подпротоколом WebSocket, WAMP естественным образом подходит везде, где используются необработанные веб-сокеты, как способ синхронизации клиентов, таких как веб-браузеры, push-уведомлений для них и обеспечения мягкой совместной работы пользователей в реальном времени.[15] Он также имеет те же ограничения, требующие поддержки клиентов, которые отсутствуют для Internet Explorer версии старше 10.[16] Это смягчается наличием полифиллы[17] использование более портативных технологий, таких как Вспышка или использование HTTP Longpoll в качестве запасного варианта. В этом смысле WAMP является конкурентом Метеор с DDP.

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

И наконец, что не менее важно, WAMP может действовать как служебная шина предприятия, служа связующим звеном между микросервисами, как если бы Корба, ZeroMQ, Apache Thrift, МЫЛО или же AMQP.

Эволюция

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

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

Сравнение

Сайт WAMP утверждает[21] следующие аргументы в пользу технологии:

  • Собственный PubSub: поддерживает публикацию и подписку из коробки (расширение не требуется).
  • RPC: поддерживает удаленные вызовы процедур из коробки (расширение не требуется).
  • Маршрутизированный RPC: поддерживает маршрутизируемые (не только двухточечные) удаленные вызовы процедур.
  • Веб-сайт: работает изначально в Интернете (без туннелирования или моста).
  • Перекрестный язык: работает на разных языках программирования и средах выполнения.
  • Открытый Стандарт: Это открытая официальная спецификация, реализованная разными поставщиками.

С другой стороны, WAMP не пытается достичь некоторых целей других протоколов:

  • Полный объект, проходящий как CORBA.
  • Синхронизация данных как DDP.
  • Одноранговое общение, например ZeroMQ.
  • Мультимедийная потоковая передача, например WebRTC.
  • Передача больших файлов, таких как HTTP.

Тем не менее, многие протоколы имеют общие характеристики с WAMP:

ТехнологииPubSubRPCМаршрутизированный RPCВеб-сайтПерекрестный языкОткрытый Стандарт
ВАМПдададададада
AJAXдадада
AMQPдададада
Apache Thriftдада
Capn'n'Protoдада
Кометадада
OMG DDSдадада
D-автобусда
CORBAдададада
DCOMдадада
Java JMSдада
Java RMIдада
JSON-RPCдададада
MQTTдададададада
ОТДЫХдадада
МЫЛОдададада
Socket.ioдада
SockJSдада
Тупитьдададада
XML-RPCдададада
XMPPдадададада
ZeroMQдада
DDP[22]дададада

Хотя важно отметить, что, хотя DDP делает Pub / Sub под капотом для синхронизации наборов данных, он не предоставляет примитивы PubSub. Это также открытая спецификация с несколькими реализациями, но не зарегистрированная как стандарт.

Рекомендации

  1. ^ Страница со списком протоколов IANA
  2. ^ Основные характеристики профиля WAMP
  3. ^ «Используя WAMP, вы можете создавать распределенные системы из компонентов приложений, которые слабо связаны и взаимодействуют в (мягком) реальном времени».
  4. ^ Несколько слов о WAMP
  5. ^ Бахга, Аршдип; Мадисетти, Виджай (9 августа 2014 г.). В этой главе [...] вы узнаете о протоколе обмена сообщениями веб-приложений [...], который предоставляет инструменты и услуги для разработки решений Интернета вещей.. ISBN  9780996025515.
  6. ^ Транспорт маршрутизатора Crossbar.io
  7. ^ «WAMP может работать через необработанные транспорты вместо WebSocket. Каждое сообщение имеет префикс uint32 (big endian), который обеспечивает (сериализованную) длину следующего сообщения WAMP».
  8. ^ Сериализация WAMP
  9. ^ «Сериализатор по умолчанию Wampy - это JSON, но он также поддерживает msgpack в качестве сериализатора, но вам нужно включить msgpack.js в качестве зависимости».
  10. ^ Схема вида птицы изнутри WAMP
  11. ^ «Транспорт с длительным опросом может передавать сеанс WAMP по старому простому протоколу HTTP 1.0 / 1.1. Это реализуется путем выдачи Клиентом запросов HTTP / POST, один для отправки, а другой для приема».
  12. ^ Архитектура перекрестного узла
  13. ^ «Брокеры и дилеры несут ответственность за общую маршрутизацию вызовов и событий и не запускают код приложения».
  14. ^ «Crossbar.io - это название самого полнофункционального роутера».
  15. ^ WAMP и AngularJS
  16. ^ "Можно ли использовать веб-сокеты?".
  17. ^ Полифиллы веб-сокетов
  18. ^ «Более того, мы сравнили WAMP с другими зарегистрированными подпротоколами WebSocket (MBWS, SOAP и STOMP) с точки зрения связанных функций; и с другими потенциальными протоколами (CoAP и MQTT) с точки зрения соответствующих практических развертываний» (PDF).
  19. ^ Приложение Tessel Alarm с Crossbar.io
  20. ^ Меню спецификаций WAMP 2
  21. ^ WAMP по сравнению
  22. ^ Характеристики DDP