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

Python и real-time

Python и real-time

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

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

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