Я использую python (Tornado) на стороне сервера и некоторый javascript на стороне клиента. У меня общая ситуация - один пользователь отправляет сообщение другому. И я хочу, чтобы сервер уведомлял браузер клиента (получателя сообщения) о новом сообщении. Как мне это сделать? Должен ли я установить долгоживущее соединение с клиентом (возможно, с помощью веб-сокета) или что-то еще?
Использование веб-сервера реального времени, такого как Tornado - да. TornadIO выглядит хорошим решением, поскольку он использует socket.io, который имеет запасные варианты для старых браузеров.
Запись Википедии о проблемах C10k содержит список серверов, которые решили эту проблему:
Для решения проблемы C10K было разработано несколько веб-серверов:
- nginx, использующий управляемую событиями (асинхронную) архитектуру вместо потоков для обработки запросов (WordPress.com использует nginx для решения проблемы C10K) [2]
- Lighttpd, использующий асинхронную архитектуру для обработки запросов [3]
- Чероки, легкий веб-сервер [4]
- Tornado, неблокирующий веб-сервер и каркас веб-приложений [5], написанный на Python
- Apache Deft, асинхронный, неблокирующий веб-сервер, работающий на JVM
- JBoss Netty, клиент-серверная инфраструктура NIO, которая позволяет быстро и легко разрабатывать сетевые приложения, такие как серверы протоколов и клиенты [6]
- Node.js, асинхронный неблокирующий веб-сервер, работающий на движке Google V8 JavaScript [7]
- EventMachine, асинхронный неблокирующий веб-сервер, работающий на Ruby EventMachine
- Yaws, веб-сервер, написанный на Erlang; получая прибыль от чрезвычайно легких процессов Эрланга.
- Medusa, неблокирующая библиотека веб-сервера, написанная на Python
Как вы увидите, Торнадо числится в списке.
Помимо этого, ваш вопрос потенциально больше касается горизонтального масштабирования , чем вопроса о том, как получать уведомления от сервера к клиенту.
В зависимости от того, какое серверное решение реального времени вы выбираете, это может никогда не стать проблемой. Например, один экземпляр Caplin System Liberator может обеспечить более 10 000 постоянных соединений.