Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

PubSub в браузере с поддержкой вебсокетов и протокола WAMP

Anna | 31.05.2014 | нет комментариев
Изучая способы реализации real-time обновления данных в браузере, я нашел “WAMP” — протокол прикладного яруса для обмена сообщениями, учрежденный на вебсокетах.
Протокол реализует два распространенных высокоуровневых образца для обмена данными: PubSub и RPC (Remote Procedure Call).Эти образцы многим вестимы и обширно используются в разных областях программирования и межпроцессного взаимодействия:

  • RPC — удаленный вызов процедур. В процессе принимают участие заказчик и сервер. 1-й отправляет запросы на вызов процедуры на сервере, а 2-й их исполняет и отправляет итог заказчику. В нормальном веб-приложении это может быть, скажем, запрос на создание комментария либо на добавление поста в избранное
  • Publish/Subscribe (PubSub) — способ обмена сообщениями, в котором заказчики «подписываются» на волнующие их события и могут сами генерировать сходственные события. Рассылкой информации подписчикам занимается третья сторона — «брокер». В WAMP образец PubSub реализован на основе «топиков», либо каналов. Скажем, на сайте такими каналами могут быть «комментарии», «новости», «собственные сообщения».

В контексте веб-разработки особенно увлекательным вариантом использования протокола WAMP является применение образца PubSub. С его поддержкой дозволено легко решить задачу обновления информации на открытой у пользователя странице сайта: скажем, Дабы отобразить только что добавленный комментарий либо показать уведомление о приобретении нового сообщения.
Реализация WAMP существует в виде библиотек под уйма языков и платформ, включая, безусловно, javascript в виде плана autobahn.

В качестве примера применения протокола испробуем разработать абстрактное веб-приложение, в котором браузер будет подписываться на канал с новыми комментариями, а сервер — их рассылать. На сервере будет трудиться PHP с восхитительной библиотекой Ratchet, которая помимо реализации собственно вебсокетов может трудиться с протоколом WAMP.

Планируя способы взаимодействия заказчика и сервера на таком сайте следует помнить, что еще существуютбраузеры, не поддерживающие вебсокеты. И правда часть задач с ними могут решить полифиллы, 100% работы в всякий среде (скажем, на андроиде) с их поддержкой добиться не удастся. Следственно умно, на мой взор, ограничить применение образца PubSub на заказчике лишь подпиской на события. Генерироваться же события будут сервером, получающим «олдскульные» ajax-запросы на создание нового комментария, от имени его автора. Таким образом все заказчики сумеют добавлять комментарии (либо, в всеобщем случае, генерировать события), а вот получать обновления в настоящем времени — только те, кто поддерживает вебсокеты.

Клиентская часть сайта.

Библиотека autobahn экспортирует в глобальную область видимости объект ab, полный список способов которого дозволено прочитать в документации. Нас же волнует способ connect:

ab.connect(
    //куда подключаемся
    'ws://site.com:8080',
    //коллбэк будет вызван позже удачного подключения.
    //внутрь будет передан объект session,
    //содержащий информацию о соединении и способы для взаимодействия с сервером
    function (session) {
        //подпишемся на новые комментарии. вторым параметром передаем функцию-обраточик события,
        //которая будет вызвана позже приобретения комментария.
        session.subscribe('comments', onNewComment);
    },
    //коллбэк будет вызван позже потери соединения.
    //библиотека сама попытается переподключиться, если указаны соответствующие опции,
    //поэтому в обработчике события реализовывать эту логику не необходимо.
    function onClose() {
        alert('Пропало соединение с сервером');
    },
    {
        //опции для переподключения к серверу
        'maxRetries': 100,
        'retryDelay': 5000
    }
);

//обработчик новых сообщений на канале comments
function onNewComment(topic, data) {
    //topic - наименование канала, с которого пришло сообщение
    //в data находятся данные, переданные сjson_decode($json, true);

    //ничего не делаем, если нет ни одного подписчика на новые комментарии
    if (!array_key_exists('comments', $this->subscribedTopics)) {
        return;
    }

    $topic = $this->subscribedTopics['comments'];

    //иначе отправляем комментарий каждому подписанным заказчикам.
    $topic->broadcast($comment);
}

Таким образом при создании нового комментария все подключенные браузеры будут получать объект с полями author и content, тот, что и ждет получить javascript-обработчик.

За процессом обмена сообщениями дозволено отслеживать в консоли chrome (фильтр «websocket» во вкладке «network») либо иного браузера. Видно, что при подключении к серверу браузер отправляет приветственное сообщение, а потом — список каналов для подписки.

Завершение.

Вот так, применив спецтехнологию WebSockets и протокол WAMP, дозволено реализовать обновление информации на веб-странице в настоящем времени способом PubSub.
Дозволено возразить, что применяя nodejs и библиотеку socket.io сделать это было бы проще, но в нашей действительности, где PHP является главенствующей серверной платформой, описанный вариант абсолютно жизнеспособен и даже больше комфортен чем другие, больше «костыльные» способы (как, скажем, периодический опрос сервера с поддержкой ajax). Также его касательно легко дозволено внедрить на присутствующий сайт: метаморфозы понадобится внести только в те части, где происходит генерация каких-либо событий, а сам демон-обработчик от сайта может быть абсолютно само­стоятелен.

Ключевые ссылки:

  • Wamp — websocket application messaging protocol.
  • Authobahn — реализация WAMP на javascript.
  • Ratchet — реализация вебсокетов и WAMP на PHP.
 Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB