Как интегрировать SockJS с другим веб-фреймворком

В качестве альтернативы Socket.io есть SockJS (https://github.com/sockjs/sockjs-client), который лучше поддерживается и более стабилен, чем Socket.io.

Этот вопрос касается концептуального понимания архитектуры использования SockJS с веб-фреймворком, скажем, для создания чат-приложения.

Насколько я понимаю, вам нужен SockJS-клиент и сервер SocketJS (в моем случае я намерен использовать SockJS-Tornado (https://github.com/MrJoes/sockjs-tornado)), чтобы иметь возможность общаться в стиле веб-сокетов.

Но как SockJS (SockJS-клиент + SockJS-Tornado) связывается с веб-фреймворком, который выполняет остальную часть работы (например, обслуживание страницы, запись/чтение в/из БД и т. д.). Например, как компонент SockJS-Tornado будет взаимодействовать с веб-сервером фреймворка? В частности, высоко ценится любое направление работы с web2py (веб-фреймворк Python).


person MLister    schedule 03.05.2012    source источник
comment
Вы можете использовать очередь сообщений, такую ​​как RabbitMQ или ZeroMQ.   -  person igorw    schedule 04.05.2012
comment
@igorw, вы говорите, что я могу использовать очередь сообщений для подключения сервера SockJS-Tornado к веб-серверу фреймворка, чтобы данные, полученные SockJS-Tornado, могли быть переданы фреймворку? Не могли бы вы уточнить? Спасибо.   -  person MLister    schedule 05.05.2012
comment
Кстати, есть еще autobahn.ws   -  person Alp    schedule 07.02.2013


Ответы (3)


Вы правы, для SockJS вам нужен сервер с поддержкой sockjs и клиентская библиотека javascript в браузере.

Обычно есть два шаблона интеграции, допустим, вы хотите использовать sockjs-tornado:

  1. Вы можете обслуживать весь свой сайт с помощью Tornado. При этом подключите sockjs-tornado к какому-либо пути, например «http://mysite.com/sockjs». В этом сценарии и ваш сайт, и sockjs будут обслуживаться с домена mysite.com.
  2. Вы можете сохранить свой сайт на любом языке/фреймворке, на котором он написан, и добавить sockjs-serveras еще один компонент в другом домене, например. «http://sockjs.mysite.com/sockjs».

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

person Marek    schedule 08.05.2012
comment
спасибо за предложения. Я хотел бы узнать больше о втором варианте, который вы предложили. В частности, как связать SockJS-Tornado с веб-сервером, используемым фреймворком. Например, каков рабочий процесс запроса из браузера на серверную часть (состоит из SockJS-Tornado и веб-сервера фреймворка) и обратно? Спасибо. - person MLister; 08.05.2012
comment
Держите два отдельных сервера. Один — ваше старое приложение. Новинка - sockjs-торнадо. Используйте HAProxy для маршрутизации, если вы хотите представить его как один домен или просто использовать два отдельных домена. Если вам нужна связь между sockjs и вашим приложением — используйте Redis Pub/sub, RabbitMQ или zeromq для обмена сообщениями между ними. - person Marek; 10.05.2012
comment
привет @Марек. как мне обмениваться сообщениями между приложением и sockjs, где у меня должно быть только 2 отдельных сервера? моя текущая настройка заключается в том, что мне нужно запустить третий ... сценарий сервера zmq, в котором связаны 4 сокета. Receiver_from_server.bind(tcp://*:5561) # zmq.PULL forwarder_to_server.bind(tcp://*:5562) # zmq.PUSH Receiver_from_websocket.bind(tcp://*:5563) # zmq.PULL forwarder_to_websocket. bind(tcp://*:5564) # zmq.PUSH - person bonbon.langes; 19.02.2014

Если вы используете web2py в качестве фреймворка, вы можете посмотреть файл comet_messaging.py в gluon/contrib. Он предоставляет функцию (comet_send) для отправки сообщений из приложения web2py вашим клиентам веб-сокетов. Он основан на tornado (без поддержки SockJS), но DistributeHandler может создать подкласс соединения SockJS, чтобы обеспечить поддержку резервного транспорта. При таком подходе ваши клиенты отправляют сообщения с помощью типичных HTTP-запросов GET или POST, которые обрабатываются контроллерами web2py (или другой инфраструктурой), и получают сообщения от контроллеров web2py, вызывая функцию comet_messaging.comet_send(), которая отправляет почтовый запрос экземпляру торнадо, который затем взрывается. его в свой список слушателей.

Измененные строки в comet_messaging выглядят так (примечание open становится on_open):

class DistributeHandler(sockjs.tornado.SockJSConnection):
    def on_open(self, r):
    group,token,name = [None, None, None]
    self.group = group or 'default'
    self.token = token or 'none'
    self.name = name or 'anonymous'   

а также

urls=[
    (r'/', PostHandler),
    (r'/token', TokenHandler),
    (r'/realtime', DistributeHandler)]

Обратите внимание, что мне пришлось удалить группу регулярных выражений в URLSpec DistributeHandler, потому что sockJS-tornado задыхался от нее. Все еще пытаюсь понять, как получить параметры из пути к обработчику on_open.

person MSlimmer    schedule 29.05.2012

Это дает полный ответ о том, как интегрировать SockJS в Django: https://stackoverflow.com/a/10950702/675065

В основном вам нужно:

  • Торнадо + SockJS-Торнадо
  • Редис + Бруква

Я использую эту конфигурацию в своем собственном проекте, и она работает очень хорошо.

Или: попробуйте использовать автобан: http://autobahn.ws/ (я еще не пробовал )

person Alp    schedule 07.02.2013