Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 14, 2011 12:12:49

yessi
От:
Зарегистрирован: 2011-04-29
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

сокет соединения на tornado websocket сервере

Привет!

сразу перейду к вопросу

у нас есть список с соединениями - waiters (взял из примера чата)
и всё хорошо, мы можем рассылать сообщения или всем или добавить функционал по условям, но это только запущен один инстанс.
а если запущено несколько и перед ними например haproxy то как тогда ?

теоретически понятно что надо иметь общий список всех подключений, доступный всем но как это организовать, что именно сохранить ?


p.s. после гугления выходил на пост http://thomas.pelletier.im/2010/08/websocket-tornado-redis/
но или я не понял или это не совсем то что надо.



Офлайн

#2 Дек. 14, 2011 15:51:24

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

сокет соединения на tornado websocket сервере

не нужен общий список подключений (конект нельзя передать), haproxy должен раскидывать подключения, т.е. не должен его рвать. websocket - создает долгое подключение - клиент будет общаться через него с одним инстансом.
этот пример с редисом должен нормально работать. вместо редиса тут можно zmq заюзать.

Офлайн

#3 Дек. 15, 2011 08:43:38

yessi
От:
Зарегистрирован: 2011-04-29
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

сокет соединения на tornado websocket сервере

да, я как раз и думал что врятли можно както соединение передать, тогда мне вот что интересно:
есть два человекак примеру у них “чатик” и если одного прокси заруливает на первый инстанс а второго на 10й, тогда первый с первого инстанса мы не узнаем о втором человеке и о том что ему надо послать сообщение



Офлайн

#4 Дек. 15, 2011 10:36:09

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

сокет соединения на tornado websocket сервере

> тогда первый с первого инстанса мы не узнаем о втором человеке и о том что ему надо послать сообщение
необязательно знать о втором, все клиенты получат сообщение, т.к. они подписаны на очередь из редиса.

Офлайн

#5 Дек. 15, 2011 13:34:47

yessi
От:
Зарегистрирован: 2011-04-29
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

сокет соединения на tornado websocket сервере

хм… не совсем понял, относительно редиса тут

def redis_listener():
r = redis.Redis(host='YOURSERVER', db=2)
r.subscribe('test_realtime')
for message in r.listen():
for element in LISTENERS:
element.write_message(unicode(message['data']))
я правильно понимаю, что благодаря этой функции, постонно запушеной в отдельном потоке буду рассылатсья сообщения ? попавшие в нужную “таблицу” в том же редисе ?

и правильно ли я понимаю что на каждом инстансе к примеру свой LISTENERS но поскольку они читают один и тот же пул сообщений и рассылают их то поэтому собщения прийдёт всем, и в связи с этим вопрос возник:

как redis_listener синхргнизируется с вебсокетным on_message ?



Офлайн

#6 Дек. 15, 2011 17:14:07

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

сокет соединения на tornado websocket сервере

кстати разработчики торнадо не рекомендуют напрямую взаимодействовать с торнадо из других потоков
вместо прямого “write_message”, нужно добавлять “событие” в ioloop торнадо.

> как redis_listener синхргнизируется с вебсокетным on_message ?
всмысле как сотрудничают однопоточный торнадо и отдельный поток?

Офлайн

#7 Дек. 15, 2011 18:17:15

yessi
От:
Зарегистрирован: 2011-04-29
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

сокет соединения на tornado websocket сервере

да я не совсем понял как в этом в этом примере рассылаются сообщения слушателям по приходу, то есть именно сам момент.



Офлайн

#8 Дек. 15, 2011 20:00:51

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

сокет соединения на tornado websocket сервере

> element.write_message(unicode(message))
element - это RealtimeHandler, в нем есть функция write_message которая отправляет байты клиенту.
LISTENERS - список “клиентов” на каждом инстансе,

когда в редис попадает сообщение, на всех инстансах сработает r.listen(), далее каждый инстанс перебирает всех клиентов и отправляет это сообщение.

Офлайн

#9 Дек. 15, 2011 20:33:38

yessi
От:
Зарегистрирован: 2011-04-29
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

сокет соединения на tornado websocket сервере

да, про element и LISTENERS было понятно … но не хватало последнего момента, то есть на каждом торнадо инстансе будет запущен редис listen()
и тут просто часть функционала получается взял на себя именно редис.

спасибо.

кстати с rmq более “правильный” вариант получится или нет ?



Офлайн

#10 Дек. 16, 2011 04:15:41

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

сокет соединения на tornado websocket сервере

yessi
кстати с rmq более “правильный” вариант получится или нет ?
zmq?
Это зависит от задачи, например если клиенты иногда отваливаются, то нужно хранить несколько последних сообщений, их можно будет хранить в редисе, если zmq, то на инстансе.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version