Как уведомить клиентский браузер о каком-то событии на сервере?

Я использую python (Tornado) на стороне сервера и некоторый javascript на стороне клиента. У меня обычная ситуация - один пользователь отправляет сообщение другому. И я хочу, чтобы сервер уведомлял браузер клиента (получатель сообщения) о новом сообщении. Как мне это сделать? Должен ли я установить долговременное соединение с клиентом (возможно, с помощью веб-сокета) или что-то еще?

PS Для подключения через websocket я нашел хорошую библиотеку TornadIO

PS2 Итак, из-за высокой нагрузки проекта установление соединения между сервером betwebb и каждым клиентом выглядит подозрительно. Я боюсь проблемы c10k. Может быть, это только недостаток моих знаний.


person Dmitry Belaventsev    schedule 20.11.2011    source источник
comment
См. мой ответ здесь: stackoverflow.com/questions/3682198 /writing-a-chat-application/ (и другие ответы на тот же вопрос)   -  person NullUserException    schedule 20.11.2011
comment
это хорошо, но у меня есть вопрос о комете. Меня пугает ситуация, когда у 10к пользователей есть подключение и после этого никто не может подключиться (проблема c10k)   -  person Dmitry Belaventsev    schedule 20.11.2011
comment
Если вы ожидаете, что к одному серверу чата будет подключено такое количество пользователей, у вас будет много других проблем, о которых нужно беспокоиться, помимо вашей базовой архитектуры.   -  person jwheron    schedule 20.11.2011


Ответы (1)


Я использую python (Tornado) на стороне сервера и некоторый javascript на стороне клиента. У меня обычная ситуация - один пользователь отправляет сообщение другому. И я хочу, чтобы сервер уведомлял браузер клиента (получатель сообщения) о новом сообщении. Как мне это сделать? Должен ли я установить долговременное соединение с клиентом (возможно, с помощью веб-сокета) или что-то еще?

Использование веб-сервера реального времени, такого как Tornado, — да. TornadIO выглядит хорошим решением, так как он будет использовать socket.io, который имеет запасные варианты для старых браузеров.

запись Википедии о проблемах C10k содержит список серверов, на которых была решена эта проблема:

Для решения проблемы C10K было разработано несколько веб-серверов:

  • nginx, который использует управляемую событиями (асинхронную) архитектуру вместо потоков для обработки запросов (WordPress.com использует nginx для решения проблемы C10K)[2]
  • Lighttpd, использующий асинхронную архитектуру для обработки запросов[3].
  • Cherokee, легкий веб-сервер[4]
  • Tornado, неблокирующий веб-сервер и платформа веб-приложений[5], написанная на Python.
  • Apache Deft, асинхронный неблокирующий веб-сервер, работающий на JVM.
  • JBoss Netty, клиент-серверная среда NIO, которая позволяет быстро и легко разрабатывать сетевые приложения, такие как протокольные серверы и клиенты[6].
  • Node.js, асинхронный неблокирующий веб-сервер, работающий на движке Google V8 JavaScript[7].
  • EventMachine, асинхронный неблокирующий веб-сервер, работающий на Ruby EventMachine.
  • Yaws, веб-сервер, написанный на Erlang; извлекая выгоду из чрезвычайно легких процессов Erlang.
  • Medusa, неблокирующая библиотека веб-сервера, написанная на Python.

Как вы увидите, Торнадо есть в списке.

Помимо этого, ваш вопрос потенциально больше касается горизонтального масштабирования, чем того, как для получения уведомлений от сервера к клиенту.

В зависимости от того, какое серверное решение в реальном времени вы выберете это может никогда не стать проблемой. Например, один экземпляр Caplin System's Liberator может обеспечить более 10 000 постоянных подключений.

person leggetter    schedule 20.11.2011