Протокол обмена сообщениями веб-приложений
Эта статья содержит контент, написанный как реклама . ( Октябрь 2016 г. ) |
WAMP — это подпротокол WebSocket , зарегистрированный в IANA . [1] указанный [2] предложить маршрутизируемые RPC и PubSub . Цель его проектирования [3] Целью является предоставление открытого стандарта для мягкого обмена сообщениями в режиме реального времени между компонентами приложений и упрощение создания слабосвязанных архитектур на основе микросервисов . Благодаря этому это подходящая сервисная шина предприятия (ESB). [4] подходит для разработки адаптивных веб-приложений или координации нескольких подключенных устройств Интернета вещей. [5]
Характеристики
[ редактировать ]Структура
[ редактировать ]WAMP требует [6] надежный, упорядоченный, полнодуплексный канал сообщений в качестве транспортного уровня , по умолчанию использующий Websocket. Однако реализации могут использовать другие транспорты, соответствующие этим характеристикам, и взаимодействовать с WAMP, например, через необработанные сокеты. [7] Unix-сокеты или длинный опрос HTTP .
сообщений Сериализация предполагает [8] Доступны целые числа, строки и типы упорядоченных последовательностей, по умолчанию используется JSON как наиболее распространенный формат, предлагающий их. Реализации часто предоставляют MessagePack как более быструю альтернативу JSON за счет дополнительной зависимости. [9]
Рабочий процесс
[ редактировать ]WAMP построен на основе взаимодействия клиент-клиент с центральным программным обеспечением, маршрутизатором, который распределяет сообщения между ними. Типичный рабочий процесс обмена данными: [10]
- Клиенты подключаются к маршрутизатору с помощью транспорта, устанавливая сеанс.
- Маршрутизатор идентифицирует клиентов и предоставляет им разрешения для текущего сеанса.
- Клиенты отправляют сообщения маршрутизатору, который отправляет их соответствующим целям, используя прикрепленные URI.
Клиенты отправляют эти сообщения, используя два примитива высокого уровня — RPC и PUB/SUB, выполняя четыре основных взаимодействия:
- Register : клиент предоставляет процедуру для удаленного вызова.
- вызов : клиент запрашивает маршрутизатор получить результат открытой процедуры от другого клиента.
- подписаться : клиент уведомляет о своем интересе к теме.
- опубликовать : клиент публикует информацию по этой теме.
Это может иметь небольшие различия в зависимости от базового транспорта. [11] Однако детали реализации скрыты от конечного пользователя, который программирует только с двумя примитивами высокого уровня — RPC и PubSub.
Безопасность
[ редактировать ]Поскольку WAMP использует Websocket, соединения можно заключить в TLS для шифрования. Даже если полная конфиденциальность не установлена, реализуется несколько механизмов для изоляции компонентов и предотвращения атак «человек посередине» . Реализации по умолчанию гарантируют, что попытка зарегистрировать уже зарегистрированную процедуру завершится неудачей.
Маршрутизаторы могут определять области как административные домены, а клиенты должны указать, к какой области они хотят присоединиться при подключении. После присоединения область будет действовать как пространство имен , не позволяя клиентам, подключенным к одной области, использовать идентификаторы, определенные в другой области для RPC и PubSub. Realms также имеет прикрепленные разрешения и может ограничивать клиентов одним подмножеством доступных действий REGISTER/CALL/PubSub.
К некоторым областям могут присоединиться только прошедшие проверку подлинности клиенты, используя различные методы аутентификации, такие как сертификат TLS , файлы cookie или простой билет.
Маршрутизируемые RPC
[ редактировать ]В отличие от традиционных вызовов RPC, которые адресуются непосредственно от вызывающего объекта к объекту, предлагающем процедуру (обычно серверному серверу), и являются строго однонаправленными (клиент-сервер), RPC в WAMP маршрутизируются промежуточным программным обеспечением и работают в двунаправленном режиме.
Регистрация RPC осуществляется на маршрутизаторе WAMP, а вызовы процедур передаются маршрутизатору WAMP аналогичным образом. Это означает, прежде всего, что клиент может выдавать все RPC через одно соединение с маршрутизатором WAMP, и ему не нужно знать, какой клиент в данный момент предлагает процедуру, где находится этот клиент или как к нему обратиться. Это действительно может меняться между вызовами, открывая возможность для расширенных функций, таких как балансировка нагрузки или отработка отказа для вызовов процедур.
Кроме того, это означает, что все клиенты WAMP равны в том смысле, что они могут предлагать процедуры для вызова. Это позволяет избежать традиционного различия между клиентами и серверными серверами и позволяет создавать архитектуры, в которых клиенты браузера вызывают процедуры на других клиентах браузера, с API, который напоминает одноранговую связь.
Однако даже при использовании многоуровневой архитектуры маршрутизатор по-прежнему остается единственной точкой отказа. По этой причине некоторые планы реализации маршрутизаторов включают функции кластеризации. [12]
Реализации
[ редактировать ]Клиенты
[ редактировать ]Поскольку основными целями WAMP являются веб-приложения и Интернет вещей, первые реализации клиентов выполняются на языках, хорошо зарекомендовавших себя в этих отраслях (перечислены только клиенты WAMP v2):
Клиентская библиотека | Язык |
---|---|
AngularWAMP | JavaScript для AngularJS платформы |
АвтобанCpp | С++ 11 |
вамплв | ЛабВЬЮ (G) |
АвтобанJS | JavaScript ( браузер и Node.js ) |
АвтобанPython | Питон |
вамповый | Питон |
Сеть:: WAMP | Перл |
магистраль.WAMP | JavaScript для Backbone.js библиотеки |
CppWAMP | С++ 11 |
Ну давай же | Эрланг |
Джавампа | Ява |
Лоуи | Два |
МДВамп | Цель-C |
Миньон | PHP |
rx.wamp | JavaScript для React библиотеки |
Травэй | PHP |
Вамп МАЛЕНЬКИЙ | С++ |
вампкк | С++ |
WampSharp | С# |
Вампи.js | JavaScript (только браузер) |
связь | Идти |
Минимальные требования для создания клиента WAMP — это возможность использовать сокеты и сериализовать в JSON. Таким образом, многие современные языки уже удовлетворяют этим требованиям благодаря своей стандартной библиотеке. Дополнительные функции, которые добавляют зависимости, такие как шифрование TLS или сериализация MessagePack, являются необязательными.
Однако постоянный характер соединений WebSocket требует использования неблокирующих библиотек и асинхронных API . В языках с одним официальным механизмом, таких как JavaScript, Erlang или Go, это не проблема. Но для языков с несколькими конкурирующими решениями для асинхронного программирования, таких как Python или PHP, это вынуждает автора клиента брать на себя обязательства по определенной части экосистемы.
По той же причине интеграция устаревших проектов также может потребовать работы. Например, наиболее популярные фреймворки Web Python используют WSGI , синхронный API, а для запуска клиента WAMP внутри рабочего WSGI требуются ручные адаптеры, такие как crochet .
Маршрутизаторы
[ редактировать ]Хотя маршрутизаторы технически могут быть встроены непосредственно в код приложения, а некоторые клиентские библиотеки также предоставляют маршрутизатор, спецификация не рекомендует использовать такую архитектуру. [13]
Поскольку фрезер является подвижной частью, его лучше всего использовать [ по мнению кого? ] как заменяемый черный ящик, как если бы можно было рассматривать Apache или Nginx для HTTP :
Маршрутизатор | Язык |
---|---|
Бонди. Архивировано 30 декабря 2019 г. в Wayback Machine. | Эрланг |
Crossbar.io. Архивировано 12 января 2015 г. на Wayback Machine. | Python (CPython и PyPy ) |
Ну давай же | Эрланг |
вампкк | С++ |
Джавампа | Ява |
Травэй | PHP |
wamp.rt | JavaScript (только Node.js) |
WampSharp | С# |
Виола | Два |
Ночная жизнь-Кролик | JavaScript (только Node.js) |
связь | Идти |
Tavendo , компания, создавшая протокол, также является автором Crossbar.io , который позиционирует себя как де-факто реализация маршрутизатора. [14] Поскольку они продвигают архитектуры на основе микросервисов, Crossbar.io включает в себя менеджер сервисов для размещения и мониторинга компонентов приложения WAMP, веб-сервер статических файлов и контейнер WSGI. Будучи написанным с использованием библиотеки Twisted , это одна из реализаций, которую можно настроить в производстве без прокси-сервера с целью замены таких стеков, как Nginx, связанных с Supervisor и Gunicorn .
Варианты использования
[ редактировать ]Будучи подпротоколом WebSocket, WAMP естественным образом подходит везде, где используются необработанные веб-сокеты, в качестве способа синхронизации клиентов, таких как веб-браузеры, отправки им уведомлений и обеспечения мягкого взаимодействия между пользователями в режиме реального времени. [15] Он также имеет те же ограничения, требуя поддержки клиента, которая отсутствует в версиях Internet Explorer старше 10. [16] Это смягчается наличием полифилов. [17] использование более портативных технологий, таких как Flash , или использование HTTP Longpoll в качестве запасного варианта. этом смысле WAMP является конкурентом Meteor DDP В .
WAMP также нацелен на Интернет вещей, где он используется так же, как MQTT. [18] как легкое и эффективное средство для организации кластеров связанных объектов. Реализации на различных языках делают его пригодным для управления и мониторинга небольших устройств, таких как Raspberry Pi (на Python) или Tessel. [19] (в JavaScript).
И последнее, но не менее важное: WAMP может действовать как корпоративная сервисная шина, служа связующим звеном между микросервисами, как это можно было бы сделать с CORBA , ZeroMQ , Apache Thrift , SOAP или AMQP .
Эволюция
[ редактировать ]WAMP в настоящее время находится в версии 2. [20] который представил маршрутизируемый RPC. На данный момент все маршрутизаторы совместимы с версией 2. Некоторые клиенты остаются непортированными: Wamp.io, AutobahnAndroid и cljWAMP.
Версия 2 спецификации разделена на две части: базовый профиль, включающий RPC маршрутизатора и Pub/Sub, и расширенный профиль, включающий уровни доверия, сопоставление шаблонов URI и список клиентов. Базовый профиль считается стабильным и реализуется текущими библиотеками, в то время как расширенный профиль все еще находится в разработке.
Сравнение
[ редактировать ]Веб-сайт WAMP утверждает [21] следующие преимущества данной технологии:
- Native PubSub : поддерживает публикацию и подписку «из коробки» (расширение не требуется).
- RPC : поддерживает удаленные вызовы процедур «из коробки» (расширение не требуется).
- Маршрутизируемый RPC : поддерживает маршрутизируемые (не только двухточечные) вызовы удаленных процедур.
- Нативный веб-интерфейс : работает в Интернете в исходном режиме (без туннелирования или моста).
- Кросс-язык : работает на разных языках программирования и средах выполнения и между ними.
- Открытый стандарт : открытая официальная спецификация, реализованная различными поставщиками.
С другой стороны, WAMP не пытается достичь некоторых целей других протоколов:
- Полная передача объектов, как CORBA .
- Синхронизация данных, такая как DDP.
- Одноранговая связь, такая как ZeroMQ .
- Потоковая передача мультимедиа, такая как WebRTC .
- Передача больших файлов, например HTTP.
Тем не менее, многие протоколы имеют некоторые общие характеристики с WAMP:
Технология | ПабСаб | ПКП | Маршрутизированный RPC | Веб-родной | Кросс-язык | Открытый стандарт |
---|---|---|---|---|---|---|
ВАМП | ||||||
АЯКС | ||||||
AMQP | ||||||
Апач бережливый | ||||||
Капитан и Прото | ||||||
Комета | ||||||
ОМГ ДДС | ||||||
D-шина | ||||||
КОРБА | ||||||
ДКОМ | ||||||
Java JMS | ||||||
Ява РМИ | ||||||
JSON-RPC | ||||||
MQTT | ||||||
ОТДЫХ | ||||||
МЫЛО | ||||||
Socket.io | ||||||
SockJS | ||||||
ТОПАТЬ | ||||||
XML-RPC | ||||||
XMPP | ||||||
НольMQ | ||||||
ДДП [22] |
Однако важно отметить, что, хотя DDP использует Pub/Sub скрыто для синхронизации наборов данных, он не раскрывает примитивы PubSub. Это также открытая спецификация с несколькими реализациями, но не зарегистрированная в качестве стандарта.
Ссылки
[ редактировать ]- ^ Страница со списком протоколов IANA
- ^ Основные характеристики профиля WAMP
- ^ «Используя WAMP, вы можете создавать распределенные системы из компонентов приложений, которые слабо связаны и взаимодействуют в (мягком) режиме реального времени» .
- ^ Несколько слов о WAMP
- ^ Бахга, Аршдип; Мадисетти, Виджай (9 августа 2014 г.). В этой главе [...] вы узнаете о протоколе обмена сообщениями веб-приложений, [...] который предоставляет инструменты и услуги для разработки решений Интернета вещей . ISBN 9780996025515 .
- ^ «Перенос маршрутизатора Crossbar.io» . Архивировано из оригинала 12 января 2015 г. Проверено 12 января 2015 г.
- ^ «WAMP может работать через Raw-транспорт вместо WebSocket. Каждое сообщение имеет префикс uint32 (с прямым порядком байтов), который обеспечивает (сериализованную) длину следующего сообщения WAMP» . Гитхаб .
- ^ Сериализация WAMP
- ^ «Сериализатором Wampy по умолчанию является JSON, но он также поддерживает msgpack в качестве сериализатора, но вам необходимо включить msgpack.js в качестве зависимости» .
- ^ Диаграмма внутреннего устройства WAMP с высоты птичьего полета
- ^ «Транспорт с длинным опросом может передавать сеанс WAMP через старый добрый HTTP 1.0/1.1. Это реализуется путем выдачи клиентом запросов HTTP/POST: один для отправки, а другой для получения» . Гитхаб .
- ^ «Архитектура узла перекладины» . Архивировано из оригинала 12 января 2015 г. Проверено 20 апреля 2015 г.
- ^ «Брокеры и дилеры несут ответственность за общую маршрутизацию вызовов и событий и не запускают код приложения» . Гитхаб .
- ^ «Crossbar.io — название самого полнофункционального роутера» . 26 декабря 2014 г.
- ^ WAMP и AngularJS
- ^ «Можно ли использовать веб-сокеты?» .
- ^ Полифилы веб-сокетов
- ^ «Более того, мы сравнили WAMP с другими зарегистрированными подпротоколами WebSocket (MBWS, SOAP и STOMP) с точки зрения связанных функций; а также с другими потенциальными протоколами (CoAP и MQTT) с точки зрения связанных с ними практических развертываний» (PDF) . Архивировано из оригинала (PDF) 13 мая 2016 г. Проверено 12 января 2015 г.
- ^ Приложение сигнализации Tessel с Crossbar.io
- ^ Меню спецификаций WAMP 2
- ^ WAMP по сравнению
- ^ Характеристики DDP