Web Application Messaging Protocol

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

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

Характеристики[править | править код]

Структура[править | править код]

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

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

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

Принцип работы[править | править код]

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

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

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

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

Обмен данных может иметь другой вид, в зависимости от выбранного протокола транспортного уровня[11]. Однако детали реализации скрыты для конечного пользователя, который взаимодействует только с двумя высокоуровневыми шаблонами проектирования — 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 как будто с одноранговой связью

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

Реализации[править | править код]

Клиенты[править | править код]

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

Client library Language
AngularWAMP JavaScript для фреймворка AngularJS
AutobahnCpp C++ 11
AutobahnJS JavaScript (браузер и Node.js)
AutobahnPython Python
wampy Python
Net::WAMP Perl
backbone.WAMP JavaScript для библиотеки Backbone.js
CppWAMP C++ 11
Erwa Erlang
Jawampa Java
Loowy Lua
MDWamp Objective-C
Minion PHP
rx.wamp JavaScript для библиотеки React
Thruway PHP
WAMP POCO C++
WampSharp C#
Wampy.js JavaScript (только браузер)
nexus Go

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

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

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

Маршрутизаторы[править | править код]

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

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

Router Language
Crossbar.io Python (CPython and PyPy)
Erwa Erlang
Jawampa Java
Thruway PHP
wamp.rt JavaScript (только Node.js)
WampSharp C#
Wiola Lua
Nightlife-Rabbit JavaScript (только Node.js)
nexus Go

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

Применение[править | править код]

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

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

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

Перспективы[править | править код]

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

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

Ссылки[править | править код]

  1. IANA protocols listing page. Дата обращения: 10 декабря 2018. Архивировано 14 декабря 2018 года.
  2. WAMP basic profile specifications (недоступная ссылка)
  3. Using WAMP you can build distributed systems out of application components which are loosely coupled and communicate in (soft) real-time. Дата обращения: 10 декабря 2018. Архивировано из оригинала 5 октября 2015 года.
  4. A few words about WAMP. Дата обращения: 10 декабря 2018. Архивировано 13 октября 2016 года.
  5. In this chapter [...] you will learn about the Web Application Messaging Protocol [...] which provide tools and services for developing IoT solutions. Дата обращения: 10 декабря 2018. Архивировано 1 октября 2018 года.
  6. Crossbar.io router transport. Дата обращения: 10 декабря 2018. Архивировано 12 января 2015 года.
  7. WAMP can run over Raw transports instead of WebSocket. Each message is prefixed with a uint32 (big endian) that provides the (serialized) length of the following WAMP message.
  8. WAMP serialization (недоступная ссылка)
  9. Wampy default serializer is JSON, but it also supports msgpack as serializer, but you need to include msgpack.js as dependency. Дата обращения: 10 декабря 2018. Архивировано 2 октября 2018 года.
  10. WAMP internals bird view diagram (недоступная ссылка)
  11. The Long-Poll Transport is able to transmit a WAMP session over plain old HTTP 1.0/1.1. This is realized by the Client issuing HTTP/POSTs requests, one for sending, and one for receiving. (недоступная ссылка)
  12. Crossbar node architecture. Дата обращения: 10 декабря 2018. Архивировано из оригинала 12 января 2015 года.
  13. Brokers and Dealers are responsible for generic call and event routing and do not run application code. (недоступная ссылка)
  14. Crossbar.io is the name of the most full featured router. Дата обращения: 10 декабря 2018. Архивировано 31 июля 2017 года.
  15. WAMP and AngularJS. Дата обращения: 10 декабря 2018. Архивировано 11 июня 2018 года.
  16. Can is use websockets ? Дата обращения: 10 декабря 2018. Архивировано 8 апреля 2017 года.
  17. Web socket polyfills. Дата обращения: 10 декабря 2018. Архивировано 28 сентября 2010 года.
  18. Moreover, we compared WAMP with other registered WebSocket subprotocols (MBWS, SOAP and STOMP) in terms of the related features; and with other potential protocols (CoAP and MQTT), in terms of the related practical deployments. Дата обращения: 10 декабря 2018. Архивировано из оригинала 13 мая 2016 года.
  19. Tessel alarm app with Crossbar.io. Дата обращения: 10 декабря 2018. Архивировано 15 января 2017 года.
  20. WAMP 2 specification menu. Дата обращения: 10 декабря 2018. Архивировано из оригинала 2 октября 2015 года.
  21. WAMP 1 specification overview. Дата обращения: 10 декабря 2018. Архивировано из оригинала 4 октября 2015 года.