salkat
@salkat
Бизнесмен. Создаём контакт-центры

Порекомендуйте язык/фреймфорк/технологию для websocket-сервера?

Добрый день

Задача: сервер, держащий 5K-10K websocket-соединений (wss) клиентов, через который эти клиенты шлют друг другу системные сообщения. Что-то типа чата, но сообщения системные, об изменении состояния каждого клиента. Каждый клиент шлёт ~ 10 сообщений в минуту, но может и по 3-5 в секунду отправить

Тестовый был сделан на node.js + PHP(как костыли местами), но вопрос с асинхронностью несколько смутил. Думаю, что проще - бороться за асинхронность (не знаю как) или выбрать что-то другое.
  • Вопрос задан
  • 1094 просмотра
Решения вопроса 3
@jacob1237
Асинхронная модель обработки сетевых соединений можно сказать что единственно верная для данной задачи.
Корень зла здесь - так называемая "проблема C10k", то есть "проблема 10 тысяч соединений": https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D...
При построении чатов эта проблема стоит особенно остро, т.к. если у Вас, например, 2000 онлайн пользователей, то и соединений с ними тоже 2000, которые необходимо поддерживать в активном состоянии в режиме реального времени.
Именно в таких случаях асинхронная модель выигрывает, потому что на каждое соединение получается очень небольшой оверхед по памяти, в отличие например от модели когда на каждое соединение создается системный поток - thread.

Теперь про возможные технологии. Написать чат на вебсокетах возможно много на чем.
Фаворитами по скорости программирования здесь будут, ИМХО, JavaScript (Node.js) и Python. По скорости же работы - Go, Erlang и прочие компилируемые языки.

Python:
1. Twisted + sockjs-twisted
2. Tornado + sockjs-tornado (уже приводили здесь)
3. Crossbar.io (http://crossbar.io/) - комплексное решение, которое позволит сконцентрироваться на логике приложения, а не на технических вопросах.
4. Разные вариации библиотек (Authobahn.io, asyncio etc.)

JavaScript (Node.js):
1. Socket.io (socket.io/) - достаточно известное решение, комплексное, позволяет не думать о технической части
2. SockJS (https://github.com/sockjs/sockjs-node) - больше библиотека чем фреймворк. Например мультиплексирование (несколько "виртуальных" соединений внутри одного сокета) придется пилить вручную (правда есть библиотеки)

Хочется отметить, что вне зависимости от использования Socket.io или SockJS, настанет момент, когда Вы захотите использовать все ядра своего процессора для обработки пользовательских соединений (по одному запущенному процессу на ядро). И вот тут на Python придется вручную писать логику построения кластера из нескольких процессов.
В Node.js эту проблему решает модуль "Cluster" (https://nodejs.org/api/cluster.html).
В принципе на Python тоже можно быстро написать этот функционал (например на Twisted), но осадочек, как говорится, остался)

По поводу скорости - JavaScript (Node.js) априори будет быстрее чем Python, т.к. там JIT компиляция.
Уравновесить ситуацию поможет PyPy - нестандартный интерпретатор Python, который тоже использует JIT-компиляцию. В этом случае разницы в скорости практически не будет заметно.

Сам я люблю и уважаю Python, поэтому порекомендую его. Хотя бы потому что в Twisted, Tornado да и asyncio есть корутины (coroutines), а в новых версиях Python даже async/await. Эти конструкции позволят Вам писать в линейном стиле и избежать лапшекода как в JavaScript.

PHP:
1. Ratchet (уже писали о нем)
2. phpDaemon

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

Если очень нужна высокая скорость и нетребовательность к ресурсам, пишите сразу на Go. Вот выше Вам уже посоветовали комплексные решения типа Centrifugo (который кстати сначала был написан на Python + Tornado).

P. S. Забыл отметить, что если Вам нужны исключительно веб-сокеты (которые будут работать во всех современных браузерах), то Вы вообще можете отказаться от Socket.io и SockJS. Эти библиотеки хороши для обеспечения совместимости со старыми браузерами, ну или для случаев, когда вебсокеты режутся сетевым оборудованием. Эти библиотеки по-умолчанию переключат браузер в режим long-polling.

Однако если Вам все это не нужно - то не берите, тем самым уменьшите оверхед на браузер и сервер.
Ответ написан
Комментировать
JRazor
@JRazor
Senior StarkOverFlow Programmer
Могу порекомендовать в качестве сервера для Python: Tornado framework + SockJS для работы с сокетами + Queue (очереди). Выбирал между оригинальными сокетами, Socket.io и SockJS: последний имел меньше всего багов на тот момент и держал больше соединений.

И да, асинхронность в работе с сокетами - полезная штука. Чего-то развелось чатов, которые падают при нагрузке выше 5К в последнее время.
Ответ написан
@serious911
Если нужно все быстро и из коробки, то рекомендую Node.js + Socket.io. Можно также использовать SockJS, но нужно учитывать, что это только продвинутая обертка над стандартными вебсокетами и нужно будет разбиратся/создавать свой функционал/API и т.п.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
https://icicle.io/
Full-featured event loop for asynchronous programming
Multiple event loop back-ends
Asynchronous TCP and UDP sockets
Asynchronous DNS resolution
Standalone HTTP and WebSocket server
Multi-processing using forking or child processes
Multi-threading using native threads
Asynchronous process signal handling
Worker pool for running blocking tasks
Non-blocking concurrency primitives
Ответ написан
Комментировать
salkat
@salkat Автор вопроса
Бизнесмен. Создаём контакт-центры
Кстати, для информации/комментариев, производительность разных языков

https://blog.famzah.net/2016/02/09/cpp-vs-python-v...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы