что такое вамп? В чем разница с вебсокетом?

WebSocket

Чтобы использовать WAMP в лабораторном проекте, поищите на крупных сайтах, где есть информация об этом соглашении, но бедные маленькие онлайн-статьи, наиболее авторитетные и правильные.Официальный сайт WAMPЛа. Поэтому нижеследующие пояснения к знаниям подытожены автором на основе собственного реального опыта и перевода официального сайта с немного плохим уровнем английского.Если есть ошибки, то надеюсь, что все будут их активно выдвигать и вместе добиваться прогресса! !

Точно так же, чтобы лучше проверить правильность кода, он все же размещенGitHubАдрес (но адреса всех роутеров были изменены, и это нужно настроить и установить самостоятельно!!)

1. Что такое WAMP?

1.1 Введение

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

Для WAMP требуется надежный, упорядоченный полнодуплексный канал сообщений в качестве транспортного уровня, по умолчанию использующий WebSocket. Однако в реальных реализациях также могут использоваться другие транспорты, соответствующие этим характеристикам, такие как необработанные сокеты или длинный опрос HTTP для связи с WAMP или использование RawSocket.

Вот сравнение двух транспортных протоколов:

  • Websocket: с помощью транспорта Websocket можно создать постоянное двустороннее соединение. Сообщения не имеют заголовков HTTP, что минимизирует накладные расходы.
  • RawSocket: двоичное сообщение, используемое WAMP через RawSocket, не требует предварительного подтверждения HTTP и имеет меньшие накладные расходы. Но его самый большой недостаток в том, что браузер не разрешает TCP-соединения. Чтобы использовать клиент в веб-браузере, необходимо установить расширение для браузера, а еще одним недостатком является отсутствие сжатия на транспортном уровне.

1.2 Режим доставки

WAMP предоставляет два режима обмена сообщениями:

  • Опубликовать и подписаться (публикация-подписка)
  • маршрутизируемые удаленные вызовы процедур (rRPC)

опубликовать и подписаться

Опубликовать и подписаться — это устоявшийся шаблон обмена сообщениями. Если компонент (подписчик) информирует маршрутизатор о топике, который он хочет получить (то есть хочет подписаться на топик), то другой компонент (издатель) может опубликовать сообщение о топике, и, наконец. Маршрутизатор рассылает события всем компонентам, подписанным на тему.

Маршрутизация вызовов удаленных процедур

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

Разница между маршрутизируемым RPC и традиционным клиент-серверным RPC заключается в том, что маршрутизатор действует как посредник между вызывающей и вызываемой сторонами, а традиционный RPC вызывает напрямую (популярные разговоры: RPC относится к процессу на компьютере A, который вызывает процесс на другом компьютере B, где вызывающий процесс на A приостанавливается, а вызванный процесс на B начинает выполняться, когда значение возвращается на A, процесс A продолжает выполняться. . )

Преимущества маршрутизируемого RPC:

  • Поскольку все сообщения маршрутизируются через WAMP, больше нет необходимости в прямом сетевом соединении или пути между вызываемым абонентом и вызывающим абонентом.

2. Маршрутизация сообщений в WAMP

WAMP открытWebSocketСоглашение предусматривает единыймаршрутизация приложений, соглашение распространяется наразныеязык.

С помощью WAMP можно создавать распределенные системы из компонентов приложений, которыенизкое сцеплениеа такжев реальном временикоммуникация.

Сначала перечислите некоторые функции (преимущества) WAMP.

  • низкое сцепление
  • на основе компонентов
  • общение в реальном времени
  • языковая независимость

2.1 Низкая связь

WAMP обеспечивает то, что мы называем связью приложений.Унифицированная маршрутизация приложений:

  • Маршрутизация событий в шаблонах публикации и подписки
  • Маршрутизация вызовов в шаблоне удаленного вызова процедур

Далее давайте сравним традиционный метод с моделью публикации-подписки и маршрутизируемыми удаленными вызовами процедур в WAMP, чтобы получить эти характеристики.

традиционный способ

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

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

Модель публикации-подписки в WAMP

В этом шаблоне издатель доставляет сообщение (тему) маршрутизатору событий, а подписчик просто подписывается на сообщение (тему) и после того, как маршрутизатор событий получает сообщение (тему), доставляет сообщение (тему) подписчику.

Во всем процессе издатель и подписчик завершают весь процесс косвенно, и другой стороне не нужно знать друг друга.

Маршрутизация вызовов удаленных процедур в WAMP

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

Из сравнения трех вышеупомянутых режимов можно сделать вывод, что два режима, предоставляемые WAMP, заключаются в добавлении маршрутизаторов (или посредников в популярном понимании), устранении необходимости связи между вызывающим и вызываемым абонентом и уменьшении потребности в общении. между нижними компонентами муфта. Это одно из преимуществ WAMP.

2.2 Компонентный

Если вы объедините маршрутизацию событий (брокер — для публикации и подписки) и маршрутизацию вызовов (дилер — для маршрутизации удаленных вызовов процедур), вы получите WAMP.маршрутизатор.

Если эти два объединены в один маршрутизатор, то этот один маршрутизатор может выполнять две функции.

2.3 В режиме реального времени

WebSocket — это новый веб-протокол, который преодолевает ограничения HTTP, когда требуется двусторонняя связь в реальном времени, и обеспечивает двусторонний обмен сообщениями в реальном времени, совместимый как с Интернетом, так и с браузерами, в дополнение к возможности работы. в среде бесплатного браузера Запуск WebSocket в .

WAMP — это официально зарегистрированный подпротокол WebSocket (работающий поверх WebSocket), который использует JSON в качестве формата сериализации сообщений.

Потому что WAMP также поддерживает двустороннюю связь в реальном времени.

2.4 Независимость от языка

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

Это также означает, что WAMP можно использовать вовремя — независимо от языка.

3. Сравните WAMP

Сравните WAMP и AJAX, Socket.IO и MQTT по следующим шести критериям (другие технологии не использовались, поэтому я не буду здесь подробно останавливаться)

3.1 Шесть критериев

  • служба поддержкимодель публикации-подписки
  • служба поддержкиУдаленный вызов процедур
  • служба поддержкиМаршрутизация вызовов удаленных процедур
  • Применимо ли это кразные языки программирования
  • Есть ли открытыйофициальный стандарт
  • Это самозапустить в сетиначальство
Технология опубликовать подписаться RPC маршрут RPC веб-родной Межъязыковый открытый стандарт
WAMP
MQTT - - -
Socket.IO - - - -
AJAX - - -

AJAX

Ajax не является ни протоколом, ни API, а шаблон программирования для JavaScript в браузере, который использует HTTP-запросы для реализации RPC-подобной связи между интерфейсом (браузером) и задней частью.

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

Поскольку AJAX использует обычные HTTP-заголовки, его накладные расходы и ограничения высоки.

Socket.IO

Socket.IO — это реализация службы клиент-сервер (публикация-подписка), написанная на JavaScript. Общайтесь с браузером, используя Node.js на стороне сервера.

По сравнению с WAMP библиотека Socket.IO позволяет подписаться на разные темы с возможностью широковещательной рассылки сообщений и пространств имен сообщений. Передача бинарных данных возможна, но требует наличия двух внешних модулей (Socket.io-stream) с обеих сторон.

Socket.IO не обеспечивает удаленный вызов процедур.

4. Реализация

4.1 Библиотека

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

Просто скажи это здесьAutobahnJS, библиотека может работать в средах JavaScript, HTML5 и NodeJS.

вставить одинGitHubАдрес, за подробностями обращайтесь на этот сайт, по сути, его использование аналогично Socket.IO, за исключением того, что перед использованием на сервер необходимо установить маршрутизатор (о нем будет рассказано ниже), вот код для базового использовать.

Режим 1: режим публикации-подписки

код издателя (издателя):

//引入库
var autobahn = require('autobahn');
//创建连接
var connection = new autobahn.Connection({
   url: 'ws://xxx.xxx.xxx:xxx/ws', //路由器的地址
   realm: 'realm1' //域(类似于Socket.io中的命名空间)
});

//监听连接
connection.onopen = function (session) {
   console.log('连接成功');
   //发布消息,第一个参数为主题,第二个参数为发布内容
   session.publish('wamptopic', ['Hello,World!']);
};
//打开连接
connection.open();

код получателя (абонента):

//引入库
var autobahn = require('autobahn');
//创建连接
var connection = new autobahn.Connection({
   url: 'ws://xxx.xxx.xxx.xxx:xxx/ws', //路由器的地址
   realm: 'realm1' //域(类似于Socket.io中的命名空间)
});
//监听连接
connection.onopen = function (session) {
   function onEvent(args) {
      var msg = args[0];
      console.log(" received: " + msg);
   }
   //订阅主题,第一个参数是主题,第二个参数是接收信息的回调函数
   session.subscribe('wamptopic', onEvent)
};
//打开连接
connection.open();

Уведомление

  • Убедитесь, что домен подписчика и издателя один и тот же (то есть, чтобы значение rea было одинаковым)
  • Данные, полученные подписчиком, представляют собой массив (документация предоставляется)

Режим 2: режим маршрутизации удаленного вызова

callee (звонящий)

//引入库
var autobahn = require('autobahn');
//创建连接
var connection = new autobahn.Connection({
    url: 'ws://xxx.xxx.xxx.xxx:xxx/ws', //路由器的地址
    realm: 'realm1' //域(类似于Socket.io中的命名空间)
});
//监听连接
connection.onopen = function (session) {
    function onEvent(args) {
        return args[0] + args[1];
    }
    //订阅主题,第一个参数是主题,第二个参数是接收、处理并返回信息的回调函数
    session.register('wamptopic', onEvent)
};
//打开连接
connection.open();

звонящий (абонент)

//引入库
var autobahn = require('autobahn');
//创建连接
var connection = new autobahn.Connection({
    url: 'ws://xxx.xxx.xxx.xxx:xxx/ws', //路由器的地址
    realm: 'realm1' //域(类似于Socket.io中的命名空间)
});

//监听连接
connection.onopen = function (session) {
    console.log('连接成功');
    //发布消息,第一个参数为主题,第二个参数为传递的参数,之后是接收调用的返回结果
    session.call('wamptopic', [2, 3]).then((res) => {
        console.log('结果', res)
    })
};
//打开连接
connection.open();

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

На официальном сайте представлено множество библиотек роутеров, т.к. лаборатория автора используетCrossbar, поэтому конфигурация других библиотек маршрутизации не ясна. Адрес после настройки — это то, что автор заменяет на xxx.xxx.xxx.xxx:xx выше. Шаги настройки на официальном сайте очень подробно описаны, тем не менее, вы можете столкнуться с различными ошибками, что потребует от вас самостоятельного решения различных проблем~~

5. В чем разница с вебсокетом

Говоря об этом, на самом деле использование WAMP и его связь и различие с Websocket было объяснено выше, Если вы не полностью понимаете это, это означает, что вы можете быть не знакомы с WebSocket, поэтому автор здесь рекомендует его самостоятельно. .Узнайте о Websocket и Socket.ioПосмотрите его, а затем сравните с этой статьей, вы найдете их отношения и разницу ~~~