2011-11-20 3 views
3

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

PS Для установления conenction через WebSocket я нашел хорошую библиотеку TornadIO

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

+1

См. Мой ответ здесь: http://stackoverflow.com/questions/3682198/writing-a-chat-application/3682211#3682211 (и другие ответы на тот же вопрос) – NullUserException

+0

это хорошо, но у меня есть вопрос о кометы. Я боюсь ситуации, когда у пользователей 10k есть соединение, и после этого никто не может подключиться (проблема c10k) – dizpers

+2

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

ответ

1

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

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

Wikipedia entry on the C10k issues предоставляет список серверов, которые эта проблема решена:

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

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

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

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

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