Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Python и real-time

Python и real-time

Емелин Александр (Mail.Ru Group)

Философия Питона гласит, что должен быть только один правильный способ сделать что-либо. К сожалению, на данный момент существует масса способов, которыми можно добавить real-time коммуникации на ваш сайт и среди них нет одного предпочтительного варианта.

Avatar for Moscow Python Meetup

Moscow Python Meetup

March 27, 2014
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. Real-time web • Счетчики • Комментарии • Чаты • Уведомления

    • Кооперативное редактирование • Игры
  2. Проблемы с вебсокетами • Не все браузеры поддерживают • Некоторые

    просто падают (safari < 5.14) • Отправка сообщения в закрытое вебсокет-соединение может привести к падению браузера (mobile safari) • Esc в Firefox < 20 закрывает все постоянные сетевые соединения • Мобильные провайдеры и антивирусы режут как хотят • Рекомендуется использовать wss и держать на портах 80, 443
  3. Асинхронные библиотеки • Twisted (2.6, 2.7, частично python 3) •

    Tornado (2.6, 2.7, 3.2, 3.3, 3.4) • Asyncio (python >= 3.3) • Gevent (2.6, 2.7) Версии Python указаны по состоянию на март 2014
  4. Пути решения • Запускаем Django в одном процессе с асинхронным

    сервером используя WSGI контейнер • Запускаем асинхронный сервер как manage.py команду • Используем отдельный асинхронный сервер • Используем облачный сервис • Используем Gevent – патчим стандартные библиотеки • Используем API uWSGI для вебсокетов И другие (BOSH, Nginx…)
  5. Преимущества Gevent • Все в одном процессе • Выигрываем в

    производительности везде, где только можно • Запросы, генерирующие события отсылаем через постоянное соединение – и можно делать динамичные игры
  6. Недостатки Gevent • Серьезное изменение архитектуры и философии проекта, манки-патчинг

    • Нужно использовать “зеленые” библиотеки • Постоянно оценивать риск блокировок.
  7. Преимущества отдельного real-time сервера • Нет магии. Ничего не патчим.

    • Не нужно менять способ деплоя приложения • Не нужно заботиться о блокирующих местах в коде. • Легко интегрировать с существующим сайтом • Существующие решения предоставляют широкие возможности “из коробки”, решая большинство озвученных ранее проблем
  8. Недостатки отдельного real-time сервера • Веб приложение должно выдерживать HTTP

    запросы, генерирующие события • Еще одна сущность, которую нужно поддерживать
  9. Centrifuge Особенности: • В качестве бекенда – Торнадо • В

    качестве клиентского полифилла - SockJS • Простое API • Масштабируется с помощью Redis PUB/SUB • Есть аутентификация • Приватные каналы • Информация о пользователях в канале, история сообщений, события о подписке/отписке https://github.com/FZambia/centrifuge
  10. Centrifuge models.py: class Tweet(models.Model): … def save(self, **kwargs): super(Tweet, self).save(**kwargs)

    send_into_centrifuge(“public:tweets”, self.to_json()) В html: <div class="centrifuge" id=“ex" data-channel=“public:tweets“ ></div> И немного javascript: $(function() { $("#ex").on("centrifuge.message", function(event, message) { console.log(message.data); }); });
  11. Ссылки • State of the Real-Time Web with Django •

    Real-time Applications and will Django adapt to it? • Discussion on hacker news • Lessons Learned Architecting Realtime Applications • Python and Real-time • Django on Gevent