Вебсокеты полезны для обеспечения постоянного дуплексного соединения между бэкенд-сервером и браузером клиента — это прочный мост между сервисом и посетителями, через который удобно беспрепятственно транспортировать потоки данных в обоих направлениях.
В результате внедрения вебсокетов наш проект получил возможность в реальном времени менять отображение страниц в браузере по своему усмотрению на протяжении всей клиентской сессии и иметь обратную связь.
В ходе построения всей технологической цепочки мы легко преодолели проблемы с браузерами, которые лишь изредка не поддерживают ни сами вебсокеты, ни их эмуляцию через flash. Однако когда дело дошло до полевых испытаний, обнаружилось множество проблем с попытками интернет-провайдеров всеми мыслимыми и немыслимыми способами сэкономить трафик за счет своих клиентов.
Об этих и других «граблях» полноценной боевой реализации вебсокетов читайте под катом.
Например, в московском офисе нашей компании прокси-сервер интернет-провайдера (самый крупный в Москве) вырезает заголовки рукопожатия вебсокетов.
Таким образом, 80% наших усилий было потрачено на решение этих проблем мирным путем.
Но есть и хорошие новости: построенный пакет технологий сейчас находится в режиме бета-тестирования.
Мы учимся контролировать все звенья технологической цепочки от выпадений – это административный вопрос, в котором мы все больше закручиваем гайки.
Мост построен, протянут и ждет своих первых посетителей.
Вот краткая хроника решения проблем на этапе реализации.
- Mojolicious не может работать в продакшене с использованием Mojo::Server::Daemon: нестабильное поведение при больших нагрузках (зависания, утечки памяти, потеря соединений).
Но на Mojo::Server::Hypnotoad он чувствует себя прекрасно.
- Safari на iPhone (iPad, iPod) использует WebSocket76, который Mojolicious больше не поддерживает. Решением стал написанный нами модуль MojoX::Transaction::WebSocket76.
- Трюки интернет-провайдеров с клиентским трафиком были побеждены решением SockJS.org, которое эмулирует веб-сокеты с помощью различных транспортов: xhr-streaming, xdr-streaming, iframe-eventsource, iframe-htmlfile, xhr-polling, xdr-polling, iframe-xhr- опрос, jsonp- опрос
- SockJS подключается к Mojolicious через добавленный SockJS-Tornado. Пришлось добавить его с помощью модуля Python WebSocket, чтобы он работал асинхронно не только по внешнему каналу, но и по внутреннему.
- Специально для наших «любимых» интернет-провайдеров транспорт через веб-сокеты работает на порту 80 (поскольку все остальные порты не защищены от блокировки интернет-провайдеров).
Мы выделили IP и поддомены для клиентских сайтов.
- Данные сеанса хранятся в MemCache.
- В качестве транспорта связи был выбран JSON RPC 2.0 + HTML::FormHandler + DBIx::Class. Все запросы к серверу представляют собой полноценные формы, ответом на которые могут быть ошибки.
Их многоязычная функциональность реализована через gettext.
- В качестве отдельных «граблов» (пусть и незначительных) стоит отметить необходимость обработки русскоязычных доменов на уровне js с помощью punycode.
- На самом деле мы пингуем браузеры клиентов.
У нас есть пинги, в ответ на которые мы принимаем понги.
Увидеть плоды внедрения можно на любых сайтах, построенных на setup.ru — вебсокеты в режиме бета-тестирования используются для форм обратной связи («ухо», «Задать вопрос») и корзины интернет-магазина.
Ссылки по теме:
- Википедия о вебсокетах
- Проект Модный
- Проект SockJS
- Перл-модуль MojoX::Transaction::WebSocket76
- Перл-модуль Моджо::Сервер::Гипножаба
- Модуль Python SockJS-Торнадо
- Модуль Python Вебсокет
- Конструктор сайтов Настройка.
ру
-
Охотники На Волков С Уолл-Стрит. Часть 3
19 Oct, 24 -
Акции Tesla Пошли На Попятную
19 Oct, 24 -
Самая Большая Натриево-Серная Батарея
19 Oct, 24 -
День Единства В Минске
19 Oct, 24