Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Centrifuge набирает циклы

Anna | 16.06.2014 | нет комментариев
Здравствуй!

Пару месяцев назад я опубликовал на Прогре статью, посвященную изложению open-source плана Centrifuge. Напомню, что это сервер рассылки сообщений подключенным заказчикам (в основном из веб-браузера) в настоящем времени. Написан на Python.

С тех пор я продолжал трудиться над планом в свободное время и теперь готов поделиться накопившимися мыслями и изменениями.

Первоначально, Центрифуга была самобытным планом. Не крепко заботясь о воспроизведении функционала существующих аналогов, я писал код так, как казалось верным мне самому. В результате сообщения заказчикам доставлялись, всё работало, но! Было ли комфортно каждому этим пользоваться? Нет!

В конце июня я наткнулся на изумительную статью от Serge Koval — Python and real-time Web. Ошеломительно, но на тот момент я не знал о существовании Faye. Статья открыла мне данный восхитительный план, как и осознавание того факта, что все-таки Центрифуга в своем нынешнем состоянии не крепко упрощает жизнь при разработке real-time веб-приложений.

С того времени я допиливал Центрифугу с прицелом на удобство применения и с оглядкой на pusher.com,pubnub.com и Faye.

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

  • Это увлекательно. В плане на данный момент применяются Tornado, ZeroMQ, Redis, SockJS, Bootstrap 3. Красивые инструменты, трудиться с которыми — бесконечное блаженство.
  • Pusher.com и Pubnub.com — облачные сервисы, не неизменно возможно/есть_смысл/хочется полагаться на третью сторону. Немыслимо внести метаморфозы в серверную часть.
  • Аналогов на Python я так и не обнаружил (может быть вы знаете?), бэкенд Faye — это Ruby либо NodeJS. Дабы сделать авторизацию подписки в канал необходимо писать растяжения на этих языках. Я же хотел сделать больше самостоятельное от языка бэкенда веб-приложения решение, предоставляющее нужный функционал из коробки.
  • Некоторые особенности, которых нет в аналогах. Это присутствие пространств имен, определяющих особенности поведения принадлежащих им каналов. Веб-интерфейс для управления планами, их настройками и вероятностью в настоящем времени следить за сообщениями в каналах.

Сейчас расскажу об изменениях, произошедших с момента написания предыдущей статьи о Центрифуге.

Во-первых, конструкция — планы, пространства имен и их настройки — сейчас по умолчанию будут храниться в SQLite — базе данных, входящей в стандартную библиотеку Python. Следственно при запуске процессов Центрифуги на одной машине огромнее нет необходимости в установке PostgreSQL либо MongoDB, как было ранее. Так как Центрифуга рассчитана на применение в маленьких и средних планах — я считаю, это значимое и надобное метаморфоза, так как одной машины должно хватить полностью.

Дозволено пойти чуть дальше — и запустить Центрифугу со конструкцией, описанной в конфигурационном файле. При этом теряется вероятность динамически вносить и сберегать метаморфозы из веб-интерфейса, но но нет никаких зависимостей от внешнего хранилища. Данная вероятность также Исключительно помогает при разработке.

Возникла помощь presence и history — сейчас дозволено узнать, кто в данный момент подключен к каналу, а также получить последние сообщения, отправленные в канал. Для хранения этих данных применяется Redis. Если Redis не настроен — данные легко не будут доступны заказчикам, ничего при этом не сломается.

Появляется вопрос. Теперь Центрифуга использует ZeroMQ PUB/SUB сокеты для коммуникации между несколькими своими процессами. Быть может, раз в игру вступил Redis в качестве хранилища информации о подключенных заказчиках и истории сообщений, то стоит применять его PUB/SUB вероятности и для коммуникации между процессами Центрифуги взамен ZeroMQ? В том исключительном сравнительном бенчмарке, тот, чтоя видел, ZeroMQ по продуктивности опережает Redis.
Следственно на данный момент я оставил все как есть. Впрочем это спорный и значимый момент.

Еще сейчас дозволено получать сообщения о подключении(отключении) заказчика к каналу (от канала). Славный пустячок.

Наконец, самое, вероятно, главное — возник javascript-заказчик — обертка над протоколом Центрифуги. Он построен на основе Event Emitter, написанного Оливером Калдвеллом (Oliver Caldwell). Сейчас взаимодействовать с Центрифугой из браузера дюже легко. Приблизительно вот так:

var centrifuge = new Centrifuge({
// настройки аутентификации
});

centrifuge.on(‘connect’, function() {
// соединение с Центрифугой установлено

var subscription = centrifuge.subscribe(‘python:django’, function(message) {
// функция, вызываемая при получении нового сообщения из канала
});

subscription.on(‘ready’, function() {
subscription.presence(function(message) {
// получена информация о подключенных к каналу клиентах
});
subscription.history(function(message) {
// история последних сообщений канала
});
subscription.on(‘join’, function(message) {
// вызывается, когда новый клиент подключается к каналу
});
subscription.on(‘leave’, function(message) {
// вызывается когда клиент отключается от канала
});
});

});

centrifuge.on(‘disconnect’, function(){
// соединение с Центрифугой потеряно
});

centrifuge.connect();

За бортом в этом примере остались настройки аутентификации (о них дозволено прочитать в документации). Также обратите внимание на наименование канала — оно состоит из имени пространства имен, которое должно быть сделано в административном интерфейсе до подключения, в данном случае это python. Непринужденно имя канала указывается позже — в данном случае это django. Пространство имен определяет настройки всех принадлежащих ему каналов. В настройках плана дозволено предпочесть пространство имен по умолчанию — тогда в javascript-коде дозволено не указывать очевидно наименование пространства имен. То есть, в случае если пространство имен python является дефолтным для плана, дозволено писать вот так:

centrifuge.on(‘connect’, function() {
var subscription = centrifuge.subscribe(‘django’, function(message) {
console.log(message);
});
});

Авторизация в такого рода приложениях, вероятно, самая трудная часть. Как я теснее упоминал, в Faye необходимо писать растяжения на NodeJS либо Ruby для охраны доступа к определенным каналам. Pusher.com для приватных каналов предлагает следующую схему:

При попытке подписаться на приватный канал, отправляется AJAX запрос на бэкенд вашего приложения с именем канала. В случае, если доступ разрешен, вы обязаны воротить подписанный результат, тот, что в последующем совместно с именем канала отправляется непринужденно в Pusher. Превосходство тут в том, что ваше приложение на момент приобретения AJAX-запроса в большинстве случаев теснее содержит объект нынешнего пользователя (скажем, в Django это request.user).

В Центрифуге используется немножко другой подход. Идентификатор нынешнего пользователя отправляется один раз в момент подключения — его вы указываете при конфигурации javascript-заказчика совместно с ID плана и токеном. Токен — это HMAC, сгенерированный на основе тайного ключа плана (о котором должен знать только бэкенд вашего приложения), ID плана и ID пользователя. Токен нужен для проверки корректности переданных ID плана и ID юзера. В последующем при подписке на приватные каналы Центрифуга будет отправлять POST запрос вашему приложению со строковыми ID юзера, именем пространства имен и именем канала. Следственно первым делом в функции-обработчике авторизации вам необходимо будет получить объект своего пользователя по ID.

Еще один значимый момент, касающийся авторизации — теперь, Дабы подписаться на несколько каналов доводится несколько раз вызывать функцию subscribe на клиентской стороне. Если каналы приватные, то всякая такая подписка будет приводить к POST запросу к вашему приложению. Не оптимизированное поведение, которое хотелось бы усовершенствовать. Но тот же pusher.com, признавая, что такие случаи хоть и редки, но бывают среди требований их заказчиков, пока в полной мере эту загвоздку не решил. Тут я пока в поиске положительного пути решения.

Хотелось бы подметить еще один метод охраны приватных данных, тот, что никто не отменял. Скажем, Дабы сделать отдельные приватные каналы для всякого пользователя приложения — дозволено генерировать сложно угадываемые имена каналов на основе какого-либо тайного ключа и ID пользователя. В таком случае абсолютно дозволено обходиться без дополнительной авторизации, по крайней мере до тех пор, пока вашим заказчикам не выигрышно делиться именами своих приватных каналов:)

Есть вероятность добавить кастомную асинхронную функцию (обрамленную tornado-декоратором @coroutine) перед публикацией сообщения в канал. Внутри этой функции дозволено делать с сообщением все что желательно, в том числе воротить None и тем самым отменить публикацию сообщения. Но, вероятно, это немного кому сгодится, как и аналогичная вероятность добавить обработчик, вызываемый позже публикации. Это довольно низкоуровневое ввязывание и требует познания Python и Tornado.

Установка Центрифуги в самом простом случае сводится к одной команде pip install centrifuge внутри virtualenv. Впрочем на машине должен быть установлен ZeroMQ (libzmq3) и dev-пакет для PostgreSQL (сам PostgreSQL сервер необязателен). Обнаруженные задачи, которые могут появиться при установке из PYPI, и метод их решения описаны в документации. Запуск одного процесса выполняется командой centrifuge. Впрочем для запуска в боевую среду понадобится конфигурационный файл, так как в нем содержатся значимые настройки безопасности. Также не обойтись без применения дополнительных опций командной строки, если вы хотите запустить несколько процессов.

Вот в этом разделе документации я постарался как дозволено подробней объяснить как работает Центрифуга, какие есть опции запуска, какой адрес указывать при подключении из браузера и многое другое. На английском, правда.

Нагрузочное тестирование пока не проводил. Верю, займусь бенчмарками в ближайшее время. Увлекательно сравнить с Faye, увлекательно запустить на PYPY. Ну и, безусловно, нужно продолжать работу над стабильностью к всевозможным ошибкам, совершенствовать Python-код и javascript-заказчик и так дальше. Присоединяйтесь!

Спасибо за внимание!

 

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB