[Moscow.pm] websocket - а что на фронтенд?

Dmitry Simonov dsimonov на gmail.com
Пн Авг 13 13:52:56 PDT 2012


В общем слушайте Дениса Ибаева, - он на этих вебсокетах собаку съел. А
я ему эту свинью подложил :)

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

Итоги внедрения: с браузерами минимальные проблемы и ох..евшие
проблемы с провайдерами, которые всеми мыслимыми и немыслимыми
способами пытаются сэкономить на трафике. Например, в моём московском
офисе Акадо (сука!) режет хёдеры хендшейка. При внедрении вебсокетов
меньше всего мы собственно занимались самими вебсокетами, а больше
всего бились над внедрением их эмуляции, в случае проблем с
провайдерами.

Итак из чего состояло внедрение:

* Мы заюзали Mojolicious с использованием Mojo::Server::Daemon на
этапе разработки. При попытке вынести его в бой, получили неустойчивое
поведение на больших нагрузках (подвисания, утечки памяти, потери
коннектов). Движок сменили на Starman, - он стал панацеей.

* Столкнулись с тем, что Сафари на iДевайзах юзает WebSocket76,
который Mojolicious уже не поддерживает. Решением стал:
https://github.com/SetupRu/mojox-transaction-websocket76

* Наступили на грабли с провайдерами, которые просто неготовы с
вебсокетам. Для них прикрутили питонячий SockJS. С ним бекендом умеет
работать Tornado, который в отличие от SockJS не умеет работать
неблокируемо с внутренниими интерфейсами. Допилили его проксёй,
обученной общаться с Mojocious родными вебсокетами. По ходу действия
столкнулись с чисто питонячими проблемами работы библиотеки WebSocket
(она сыровата ещё). Вообще некоторые Http-протоколы на питоне
смотрятся толи сыровато, то ли там какой-то совершенно иной подход,
сильно отличающийся от перла с точки зрения именно интерфейсов.

* Специально для наших "любимых" провайдеров транспорт вебсокетов
пропускаем по 80му порту (все остальные порты ни каким образом от
блокироки провайдерами не защищены), - для этого специально выделены
ip-шники.

* Для хранения сессионных данных используем мемкеш.

* Параллельно всему этому развивался и допиливался js-кусок,
работающий с Mojolicious и SockJS, постепенно превращаясь в правильный
инструмент. Архитектурно вся связка работает по протоколу JSON RPC
2.0. Бекенд выступает как полноценное API, входными интерфейсом к
котором прикручен HTML::FormHandler, как инструмент умеющий правильно
валидировать приходящие формы (понятно, что вместо форм мы оперирует
JSON-конструкциями).

* Как отдельные грабли (хотя и незначительные) назову необходимость
обрабатывать на уровне js русскоязычные домены с использованием
punycode.

* Прикрутили многоязычность.

Результирующая связка следующая:

Browser <=> fh.js <=> ( SockJS <=> Tornado <=> ) Starman <=>
Mojolicious <=> HTML::FormHandler <=> MemCache + DBIx::Class.

Получившаяся схема имеет 100% покрытие всех пользователей. На текущий
момент построенная связка находится в бета-тестировании и мы учимся
контролировать все звенья, чтобы они тупо не выпадали. До сих пор
некоторым образом некоторые звенья то выпадают, то отключаются, то их
тупо кто-то стреляет. Но это уже вопросы администрирования, на котором
мы всё туже затягиваем гайки. Мост наведён, вытянут в струнку и готов.

Смотреть можно на любых сайтах построенных на setup.ru, - вебсокеты в
режиме бета-тестирования используются для формы обратной связи (ушко
"задать вопрос") и корзины:
* http://проба-пера.рф/ - форма обратной связи
* http://tekstil33market.ru/katalog/polotentca/makhrovoe-polotentce-00952
- корзина
* http://myxbox360.ru/console/xbox-360-slim-freeboot - простая форма заказа

Следует обратить внимание, что все три типа формы работают по одному и
тому же единому протоколу.

Жду фидбека: вопросы, замеченые косяки, пожелания.
Полный список всех сайтов на setup.ru здесь: http://setup.ru/top/

---
Dmitriy V. Simonov,
Perl & Python programmer


2012/8/14 Akzhan Abdulin <akzhan.abdulin на gmail.com>:
> HA Proxy, не?
>
> 13 августа 2012 г., 14:13 пользователь Ivan Petrov <i.petro.77.00 на gmail.com>
> написал:
>
>> хочу таки попробовать проектик на вебсокетах сваять. хоть половина
>> браузеров его и не поддерживает, но поскольку нужен довольно сильный
>> интерактив, видимо придется клиенту говорить "поставьте другой
>> браузер" если его браузер их не поддерживает...
>>
>> соответственно у нас везде инфраструктура была такая: nginx на
>> фронтенде и куча бакендов в зависимости от location.
>> сунулся в nginx - он вроде вебсокеты еще не поддерживает. а что вместо
>> него поюзать можно?
>> --
>> Moscow.pm mailing list
>> moscow-pm на pm.org | http://moscow.pm.org
>
>
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>


Подробная информация о списке рассылки Moscow-pm