Исследование Производительности Сервера Sockjs

Добрый день! Так уж получилось, что я работаю над всякими разными пуш-технологиями с помощью Tornado. я это описал чуть раньше Торнадио2 , серверная реализация протокола Socket.io сверху Торнадо .

Сейчас я хочу представить аналогичный проект - sockjs-торнадо .

Для тех, кому не очень интересно, есть и другая полезная информация: сравнительное нагрузочное тестирование PyPy 1.7 против CPython 2.6.6, sockjs-node и socket.io (оба на node.js 0.6.5).

Всё под катом :-) Во-первых, что такое SockJS? Это клиентская библиотека, написанная на javascript, которая имитирует API Websocket, но в то же время поддерживает все браузеры, используя различные суррогаты в виде длинного опроса ajax, jsonp-polling и тому подобного.

В целом очень похоже на Socket.io, но с некоторыми ключевыми отличиями.

Небольшое отступление — к клиентской части библиотеки я не имею никакого отношения, разве что рассылал отчеты об ошибках и всячески раздражал ее разработчиков.

Так зачем же оно нужно, если оно существует? сокет.io ? Вот несколько причин, которые привели к разработке SockJS: 1. Разработчики Socket.io, начиная с версии 0.7, куда-то зашли не так.

Вместо того, чтобы исправлять ошибки и добавлять поддержку разных браузеров, они решили сделать API более высокоуровневым.

Не спорю - все нововведения очень удобны, но количество ошибок не уменьшилось.

Например, довольно серьезное состояние гонки больше не может быть закрыто.

3 месяца .

После отключения соединение по-прежнему не работает. Ну и тому подобное.

2. Иногда не хочется привязываться к конкретной библиотеке.

Если вы используете сокет.io, то отказаться от него будет сложно, так как придется менять все места, где есть привязка к сокету.

io. Так что же такое SockJS? 1. Как отмечалось ранее, это простая замена Websocket API для браузера.

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

2. SockJS работает даже в Opera, что очень не нравится socket.io. Кроме того, SockJS корректно работает с разными антивирусами — откатывается к другому транспорту, а SockJS вообще не может установить соединение.

3. SockJS поддерживает протоколы потоковой передачи: одно постоянное соединение с сервером для исходящих данных.

Socket.io отказался от потокового транспорта, начиная с версии 0.7. 4. Протокол намного проще и очень хорошо документирован.

Для разработчиков существует даже набор тестов, которые должна пройти серверная реализация.

5. Масштабируемость встроена в протокол.

Например, балансировщику нагрузки не нужно работать с кукисами для организации прикреплённой сессии — вся необходимая информация уже есть в URL. 6. Библиотека очень хорошо протестирована в разных условиях, она даже доступна квнит тесты, которые тестируют как клиент, так и сервер прямо из браузера.

Например, вот пример тестов для sockjs-node: http://sockjs.popcnt.org/ В общем, эта штука просто работает. Теперь ко второй части статьи, производительности.

Написав sockjs-tornado, я решил проверить, насколько он соотносится с «родным» сервером, написанным на node.js. Сейчас node.js очень моден, особенно часто говорят о его работоспособности в различных push-технологиях.

Заранее скажу, что результаты теста меня немало удивили.

Выбранная методология тестирования была очень простой: у нас есть чат-сервер с одной комнатой.

Сервер просто отправляет каждое входящее сообщение всем участникам чата.

Если интересно, Здесь код сервера.

Существует клиент Websocket, который отправляет пинг и ждет «своего» ответа.

После получения ответа он подсчитывает время, затраченное между отправкой и получением.

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

Возможно, кто-то спросит — а что же на самом деле тестируется? Вот что тестируется: — Скорость реализации протокола Websocket для разных серверов — Максимальное количество сообщений, при которых сервер начинает задыхаться — Накладные расходы на поддержание большого количества соединений — Время отклика при разных уровнях нагрузки На другой вопрос, зачем нам «тупой» чат, в котором вообще нет логики? Если кто сталкивался с таким проектом как Скромный инди-пакет , они показывают сумму заработанных денег в режиме реального времени.

Итак, они используют «брокера», который «держит» большое количество веб-клиентов.

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

Брокер должен отправить эту информацию всем своим подключенным клиентам.

Чем быстрее работает брокер, тем больше клиентов он сможет обслужить за минимальное время.

Исследование проводилось на английском языке, так как разработчики sockjs попросили провести сравнительное тестирование с sockjs-node и вы можете это увидеть Прямо здесь .

Если кому интересно, могу перевести статью на русский язык.

Вкратце, мы получаем следующую картину: — sockjs-node может отправлять до 45 000 сообщений в секунду со средним временем ответа 200 мс.

— sockjs-tornado на cpython 2.6.6 может выдавать до 55 000 сообщений в секунду со временем отклика 200 мс — sockjs-tornado на pypy 1.7 просто разрывается от более чем 150 000 сообщений в секунду.

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

По оси X указано количество сообщений, отправленных сервером за одну секунду.

Ось Y — время отклика.

Каждая строка представляет собой комбинацию сервера (node=sockjs-node, socket.io=socket.io node, cpython=sockjs-tornado на cpython, pypy=sockjs-tornado на pypy 1.7) с количеством одновременных подключений.

Socket.io приведен в качестве примера производительности другого проекта node.js. Даже если не сравнивать node.js и cpython, производительность pypy стала для меня полной неожиданностью.

Ну и в заключение.

Я рекомендую обратить внимание на SockJS, если вы планируете использовать какие-либо функции реального времени, даже если вы уже рассматривали варианты с Socket.io. И я надеюсь, что sockjs-tornado будет полезен кому-то еще.

Теги: #python #tornado #sockjs #sockjs-tornado #Socket.io #benchmark #pypy #node.js #python

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.