Отправка сервера в реальном времени с помощью Socket IO (или Strophe.js), XMPP и Django

У меня есть несколько собственных мобильных приложений для Android и iOS, которые я написал, которые напрямую подключаются к серверу XMPP, который я размещаю. Они передают и извлекают данные в реальном времени через XMPP. Я также использую некоторые из расширений XMPP XEP. Для других операций у меня есть приложение django, работающее на том же сервере, который все мобильные приложения используют через интерфейс HTTP REST. Я использую Celery и Redis для стороны django, чтобы выполнять некоторые операции асинхронно (например, делать тяжелые пакетные записи в мою базу данных).

Все это работает отлично и денди. Ура.

Но теперь я хочу написать веб-интерфейс для всего этого, поэтому я начал исследовать свои варианты и, что ж, существует так много способов снять шкуру с кота, что я хотел сначала проверить с сообществом SO.

Идея иметь библиотеку js, которая дает мне унифицированный API для связи с сокетами (т. е. попробовать разные реализации веб-сокетов или вернуться к флэш-памяти), мне нравится, поэтому я упоминаю Socket IO. Идея запуска сервера nodejs, ну, не так уж и много (еще одна вещь, которую нужно изучить), но если мне придется, я обязательно это сделаю. Я знаю, что некоторые люди используют gevent в качестве замена узла сервера. Другие решают написать небольшие узлы, которые они подключают к остальным их стек. Я бы, наверное, сделал это.

Другой вариант — использовать библиотеку js XMPP, такую ​​как Strophe, которая, как мне кажется, не имеет резервного флэш-памяти. Кроме того, мне нужно будет изучить, что это означает для моего сервера.

Я прочитал несколько ответов Stackoverflow о том, как сделать комету и джанго, поэтому кажется, что есть несколько вариантов.

Вопрос в том:

Если я хочу получить преимущество от поведения Socket IO (с резервными вариантами) и хочу передать данные в реальном времени веб-клиенту (который передается на сервер через XMPP), и использовать Django, что является моим лучшим вариантом? ?

Обновление: я использую XMPP-сервер ejabberd, который также поддерживает BOSH. Я понимаю, что мог бы использовать Strophe.js, и, таким образом, мое общение проходило бы через HTTP-соединение с длительным опросом. вместо веб-сокетов. Насколько я могу судить, есть некоторые открытые XMPP через веб-сокеты. исходная библиотека, но, насколько мне известно, сообщество не так активно, как сообщество SocketIO.

Обновление 2. Мне нужно поддерживать только современные браузеры. Я предполагаю, что это означает, что резервный вариант Flash не будет таким важным, что склоняет меня к strophe.js.


person rburhum    schedule 28.04.2012    source источник
comment
Существуют реализации сервера socket.io на других языках, кроме js. Node — это просто эталонный сервер. У меня есть сервер socket.io, использующий go-socket.io, написанный на Go. Python имеет TornadIO2, который использует торнадо в своем стеке.   -  person jdi    schedule 30.04.2012


Ответы (4)


Не уверен, зачем вам нужен резервный вариант Flash, если вы собираетесь использовать BOSH (XEP-0124, XEP-0206), что и делает strophe.js. Если вам не нужна поддержка IE7, вы можете использовать CORS из strophe.js, но не даже нужен прокси для того же происхождения. IE6 будет работать, потому что он небезопасен, а IE8+ поддерживает едва работающую форму CORS.

Чтобы получить информацию от django через XMPP к вашему клиенту, выполните компонентное подключение (XEP-0114) к вашему серверу, используя ваша любимая библиотека Python XMPP, например SleekXMPP из вашего приложения Django. Организуйте, чтобы это соединение было относительно долговечным для повышения производительности (т. е. не создавайте новое для каждого клиентского соединения). Отправьте протокол по мере необходимости.

Вы не указали, какой сервер XMPP вы используете. XMPP-серверы, не поддерживающие BOSH, становятся редкостью, но если он у вас есть, вам может понадобиться Punjab в качестве BOSH- to-XMPP proxy, или вы можете переключиться на более новый сервер, например Просодия.

person Joe Hildebrand    schedule 30.04.2012
comment
Я использую ejabberd, который уже поддерживает BOSH, поэтому прокси мне не нужен. Мне не нужно поддерживать IE6-IE7, и я также могу исключить IE8 из уравнения. - person rburhum; 01.05.2012

Я думаю, что как только вы запачкаете руки каким-нибудь узлом, вы обнаружите, что отказаться от Node для socket.io будет намного сложнее. В узле есть очень простые в использовании модули xmpp, готовые к работе (см. https://github.com/astro/node-xmpp). Помните, что узел полностью состоит из javascript, так что вы, вероятно, уже знакомы с его программированием.

Лично у меня были некоторые проблемы с утечкой памяти при использовании узла 0.6 или выше. Node 0.4 работал без этих проблем. Если вы новичок в github (как я был до того, как начал играть с Node), вот как вы можете начать работу с сервером Node.

Получение узла

  1. Войдите в свой ящик Linux и любимый каталог (я предполагаю /)
  2. git clone https://github.com/joyent/node.git
  3. компакт-диск / узел
  4. git tag -l (это выведет список всех доступных версий узла)
  5. git checkout v0.6.16 (это будет проверка версии узла 0.6.16, вы можете заменить ее на v0.4.12, например, если у вас есть проблемы с памятью)
  6. ./настроить
  7. сделать
  8. сделать установку

Для его создания вам понадобятся определенные инструменты разработки, такие как g++, но на данный момент у вас будет работающая команда node.

Установка модулей Node, таких как xmpp

В Node есть большое количество модулей, большинство из которых уже написано за вас. На http://search.npmjs.org есть средство поиска, или вы можете получить доступ ко всем модулям непосредственно из вашей оболочки. с помощью команды npm. NPM — это инструмент узлов для установки и управления модулями узла. Например, вы можете ввести npm search xmpp для поиска всех модулей xmpp. Чтобы установить базовую библиотеку xmpp для узла, вы должны сделать npm install node-xmpp. Кстати, большинство страниц модуля узла github будут содержать инструкции в файле readme на главной странице.

Поддержание работоспособности узла в рабочей среде

Это бросило меня, когда я только начинал. Если у вас есть какие-либо ошибки, которые не будут пойманы, узел просто умрет. Таким образом, вы можете либо 1. Убедиться, что ошибок нет вообще, либо они все перехвачены (маловероятно, потому что даже сам Node будет ошибаться) 2. Использовать обработчик uncaughtException, чтобы отловить эти проблемы. Вы бы использовали такой код в своей программе

process.addListener("uncaughtException", function (err) {
    util.log("Uncaught exception: " + err);
    console.log(err.stack);
    console.log(typeof(this));
    // maybe email me?

});

Безопасность и использование навсегда

Даже с проблемой uncaughtException ваша работающая программа может умереть. Памяти на исходе, segfaults, кто знает что. Вот где стоит использовать что-то вроде замечательного модуля Node под названием «Forever» (см. https://github.com/nodejitsu/forever). Вы можете ввести npm install forever -g для установки навсегда. Обратите внимание на параметр -g, который навсегда помещает в ГЛОБАЛЬНЫЙ каталог модуля узла. Без -g он помещает модуль узла в текущий рабочий каталог. Затем вы сможете ввести что-то вроде (при условии, что ваша программа node называется my_program.js) forever start my_program.js, и тогда программа Forever позаботится о том, чтобы в случае ее смерти она была перезапущена.

person crickeys    schedule 01.05.2012

Прежде всего, полное раскрытие: я работаю в компании под названием PubNub, о которой я вскоре упомяну.

Существует целый ряд размещенных служб двунаправленного обмена сообщениями (иногда называемых IaaS — инфраструктура как услуга), которые, на мой взгляд, заслуживают внимания. Это Pusher, Firebase, Flotype, PubNub и другие. Я достаточно уверен, что вы могли бы использовать любой из них для того, чего вы хотите достичь. Firebase имеет встроенную базу данных, которая напрямую связана с их сервисом, что является довольно интересной функцией, но, вероятно, бесполезной для вашего конкретного случая использования (я предполагаю, что у вас уже есть база данных на вашем сервере).

Я не могу слишком много говорить о наших конкурентах, но если вам нужна библиотека JavaScript на внешнем интерфейсе, которая взаимодействует с вашим внутренним интерфейсом Python, мы (PubNub) предоставляем очень похожий API на обоих языках, который взаимодействует с одной и той же шиной данных в облаке. Таким образом, вы можете отправлять сообщения с помощью Python и перехватывать их с помощью JavaScript или наоборот. Мы даже написали размещенную на PubNub версию socket.io, который вы могли бы использовать вместо нашего ванильного API-интерфейса JavaScript, и при этом он все равно был бы связан с вашим бэкэндом Django примерно в 10 строках кода.

Наконец, преимущество использования IaaS (или, по крайней мере, нас; опять же, я не уверен в других), заключается в том, что мы решаем эту сложную проблему масштабирования за вас. Если вы дойдете до миллиона одновременных пользователей и вам нужно что-то донести до них в режиме реального времени, вы обнаружите, что это не проблема.

person Phil Deschaine    schedule 01.05.2012

Мы также используем push в реальном времени с Django и Celery. Когда я впервые создал архитектуру, я также исследовал свои варианты. В конце концов, я решил, что лучше сосредоточусь на том, чтобы приложение было правильным, а не возился с работой DevOps. Существует несколько сервисов, которые предлагают размещенную технологию push-уведомлений в реальном времени, которую можно легко интегрировать с любым приложением.

Я выбрал PubNub и очень доволен. Они поддерживают socket.io для клиентской стороны и имеют библиотеку Python, которую я использую от рабочих Django и Celery. У них также есть SDK, которые вы можете использовать из собственных мобильных приложений.

Я знаю, у вас уже есть рабочая установка. Но я держу пари, что время, которое потребуется вам, чтобы заменить вашу текущую установку таким размещенным решением, будет меньше, чем время, которое вам потребуется, чтобы найти хорошее решение для того, что вы ищете, и внедрить его. Также имейте в виду затраты на обслуживание в будущем (особенно, если вы выберете библиотеку, которая не поддерживается в хорошем состоянии).

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

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

person zvikico    schedule 01.05.2012
comment
Проблема в том, что каждый клиент потенциально может отправить 1 сообщение в секунду и будет получать, самое большее, 1 сообщение в секунду (это только в том случае, если я буферизую, оптимизирую и сжимаю сообщения со стороны сервера в 1). Поскольку это будет критическая часть моей инфраструктуры, я бы предпочел не отдавать это на аутсорсинг другой компании. Тем не менее, ваша ссылка на вопрос о кворе дала ссылки на несколько вариантов самостоятельного размещения. Спасибо! - person rburhum; 01.05.2012