Кросс-соединение WebSocket (Tornado?)

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

Прежде всего, я использую WebSockets, чтобы иметь связь с низкими издержками между двумя или более клиентскими машинами. (Для целей разговора давайте просто скажем, что это чат-клиент). Очевидно, я могу подключиться к серверу с нескольких компьютеров, и все они могут отправлять сообщения на сервер, и сервер может отвечать, и это здорово! Но это не намного лучше, чем ваши стандартные запросы AJAX. Если у меня есть постоянное соединение, я хочу также иметь возможность передавать данные клиентам. Самый простой возможный сценарий: пользователь 1 отправляет сообщение на сервер, и, получив его, сервер немедленно отправляет его пользователю 2.

Итак, что было бы хорошим способом добиться этого? Насколько я вижу, в Tornado нет другого способа связи между соединениями, кроме размещения сообщения в каком-либо хранилище данных и опроса всех других соединений для получения новой информации. Это кажется мне ужасно неуклюжим, потому что все, что вы на самом деле делаете в этот момент, — это перенос процесса опроса с клиента на сервер.

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


person Toji    schedule 02.11.2010    source источник


Ответы (2)


Вот сервер чата, использующий tornado, WebSockets и Redis: https://gist.github.com/pelletier/532067 (Обновлено: ссылка исправлена, спасибо @SamidhT)

person kanaka    schedule 02.11.2010
comment
Замечательный! Это именно то, что я искал. Теперь, когда я смотрю на код, это кажется очевидным, но задним числом всегда 20/20, а? Кроме того, спасибо, что непреднамеренно указали мне на Redis, который на самом деле был следующим, что я собирался искать! (энергонезависимое хранилище данных в памяти) - person Toji; 02.11.2010
comment
старая ссылка мертва. Вот новый gist.github.com/pelletier/532067. - person Pdksock; 11.01.2014

Хотя ответ уже принят: использование другого сервиса все еще кажется мне очень неэффективным. Почему бы вам просто не использовать общую память + условные переменные/семафоры? Вы говорите так, будто у вас стандартная проблема Потребитель-Производитель.

person griffin    schedule 12.05.2013