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

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

Все это прекрасно работает и денди. Yay.

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

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

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

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

Возникает вопрос:

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

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

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

Ответ 1

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

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

Вы не указали, какой сервер XMPP вы используете. Серверы XMPP, которые не поддерживают BOSH, становятся редкими, но если у вас их, вам может понадобиться Punjab в качестве прокси-сервера BOSH-XMPP или вы можете переключиться на новый server, например Prosody.

Ответ 2

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

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

Получение Node

  • Войдите в свою Linux-папку и любимый каталог (предположим/)
  • git clone https://github.com/joyent/node.git
  • cd/node
  • git tag -l (это отобразит всю доступную версию Node)
  • git checkout v0.6.16 (это будет проверка версии 0.6.16 node, вы можете заменить ее на v0.4.12, например, если у вас проблемы с памятью)
  • ./Configure
  • сделать
  • make install

Вам понадобятся некоторые средства разработки, такие как g++, но на данный момент у вас будет рабочая команда node.

Установка node Модули, такие как xmpp

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

Сохранение node Запуск в производстве

Это бросило меня, когда я только начал. Если у вас есть ошибки, которые не пойманы, node просто умрет. Итак, вы можете 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?

});

Будьте в полной безопасности и используйте Forever

Даже с проблемой uncaughtException ваша программа в производстве может умереть. Память иссякает, segfaults, кто знает что. То, что платит использовать что-то вроде замечательного модуля node под названием "Forever" (см. https://github.com/nodejitsu/forever). Вы можете ввести npm install forever -g для установки навсегда. Обратите внимание на параметр -g, который ставится навсегда в каталоге модуля GLOBAL node. Без -g он помещает модуль node в текущий рабочий каталог. Затем вы сможете ввести что-то вроде (если ваша программа node была вызвана my_program.js) forever start my_program.js, а затем программа Forever будет следить за тем, что если она умрет, она будет перезапущена.

Ответ 3

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

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

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

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

Ответ 4

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

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

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

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

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