yessi
Дек. 14, 2011 12:12:49
Привет!
сразу перейду к вопросу
у нас есть список с соединениями - waiters (взял из примера чата)
и всё хорошо, мы можем рассылать сообщения или всем или добавить функционал по условям, но это только запущен один инстанс.
а если запущено несколько и перед ними например haproxy то как тогда ?
теоретически понятно что надо иметь общий список всех подключений, доступный всем но как это организовать, что именно сохранить ?
p.s. после гугления выходил на пост
http://thomas.pelletier.im/2010/08/websocket-tornado-redis/но или я не понял или это не совсем то что надо.
o7412369815963
Дек. 14, 2011 15:51:24
не нужен общий список подключений (конект нельзя передать), haproxy должен раскидывать подключения, т.е. не должен его рвать. websocket - создает долгое подключение - клиент будет общаться через него с одним инстансом.
этот пример с редисом должен нормально работать. вместо редиса тут можно zmq заюзать.
yessi
Дек. 15, 2011 08:43:38
да, я как раз и думал что врятли можно както соединение передать, тогда мне вот что интересно:
есть два человекак примеру у них “чатик” и если одного прокси заруливает на первый инстанс а второго на 10й, тогда первый с первого инстанса мы не узнаем о втором человеке и о том что ему надо послать сообщение
o7412369815963
Дек. 15, 2011 10:36:09
> тогда первый с первого инстанса мы не узнаем о втором человеке и о том что ему надо послать сообщение
необязательно знать о втором, все клиенты получат сообщение, т.к. они подписаны на очередь из редиса.
yessi
Дек. 15, 2011 13:34:47
хм… не совсем понял, относительно редиса тут
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 ?
o7412369815963
Дек. 15, 2011 17:14:07
кстати разработчики торнадо не рекомендуют напрямую взаимодействовать с торнадо из других потоков
вместо прямого “write_message”, нужно добавлять “событие” в ioloop торнадо.
> как redis_listener синхргнизируется с вебсокетным on_message ?
всмысле как сотрудничают однопоточный торнадо и отдельный поток?
yessi
Дек. 15, 2011 18:17:15
да я не совсем понял как в этом в этом примере рассылаются сообщения слушателям по приходу, то есть именно сам момент.
o7412369815963
Дек. 15, 2011 20:00:51
> element.write_message(unicode(message))
element - это RealtimeHandler, в нем есть функция write_message которая отправляет байты клиенту.
LISTENERS - список “клиентов” на каждом инстансе,
когда в редис попадает сообщение, на всех инстансах сработает r.listen(), далее каждый инстанс перебирает всех клиентов и отправляет это сообщение.
yessi
Дек. 15, 2011 20:33:38
да, про element и LISTENERS было понятно … но не хватало последнего момента, то есть на каждом торнадо инстансе будет запущен редис listen()
и тут просто часть функционала получается взял на себя именно редис.
спасибо.
кстати с rmq более “правильный” вариант получится или нет ?
o7412369815963
Дек. 16, 2011 04:15:41
yessi
кстати с rmq более “правильный” вариант получится или нет ?
zmq?
Это зависит от задачи, например если клиенты иногда отваливаются, то нужно хранить несколько последних сообщений, их можно будет хранить в редисе, если zmq, то на инстансе.