30af39d288daa368016b6bb7eb9c36ad.ppt
- Количество слайдов: 21
Centrifuge – мгновенные сообщения для веб-приложений. Эволюция от Python к Go. Александр Емелин, 2015.
О докладчике • Работаю в Mail. Ru Group, участвую в разработке внутренних и некоторых внешних сервисов компании • Пишу на Python и иногда на Javascript • С недавних пор полюбил еще и Go • Профиль на Github – https: //github. com/FZambia
Мгновенные (real-time) сообщения? • Сообщение о неком событии, доставленное в браузер клиента моментально после того, как бэкенд приложения узнал о событии • Никакой перезагрузки страницы и периодических AJAXзапросов, только push • Менее чем за 250 мс
С чего всё начиналось • Корпоративный интранет – Server-Sent Events, Twisted (Cyclone) для мгновенных сообщений • Неудавшаяся идея агрегатора (Sentry для “всего”) • Wait for it… • Centrifuge
Клиентская часть • • Web. Sockets Web. Suckets (https: //speakerdeck. com/3 rdeden/websuckets) Полифиллы к Web. Sockets – Socket. io, Sock. JS и другие Pub/Sub библиотека – для удобного менеджмента каналов
Серверная часть • Django, Flask… Если мы говорим о Python • Django-подобные фреймворки в других языках программирования • Как быть?
Пути решения • Переписать всё на Asyncio, Tornado или подобном асинхронном фреймворке. Или другом языке (Javascript, Go, Erlang) • Gevent подход • Web. Socket API веб-сервера (uwsgi) • Nginx-push-stream-module • Внешний асинхронный сервер/сервис
Внешний асинхронный сервер/сервис • Open-source решения (Faye, Autobahn, DKLAB Realplexor, Centrifuge/Centrifugo и др. ) • Внешний, зачастую платный, сервис (pusher. com, pubnub. com и др. )
Centrifuge
Генерация токена для подключения
Возможности “из коробки” • Авторизация • Масштабирование через Redis PUB/SUB • Активные подключения в канале (presence), история сообщения в канале (history), события подписки/отписки (join/leave) • Разные типы каналов • API, библиотеки для Python, Ruby, PHP • Javascript-клиент • Административный веб-интерфейс • И другие…
Centrifugo
Почему Go • Производительность (4 -20 x) • Использование нескольких ядер одновременно • Встроенная в язык concurrency-модель - горутины, возможность использовать все доступные библиотеки без необходимости поиска неблокирующих • На выходе один исполняемый файл под все платформы • Проблемы с Tornado • Проще вносить изменения в код
Марафон коммитов длиной в 2 месяца
Другие плюсы Go, обнаружившиеся в процессе • • Конфигурация – Viper Просто тестировать Race detector Debug – возможность в рантайме пронаблюдать за жизненным циклом горутин
И еще одна деталь • Удалось выделить real-time ядро Центрифуги в отдельный модуль, который можно использовать извне
Ссылки на проект • Организация Centrifugal на Github со всеми репозиториями • Документация на gitbooks. io • Демо-инстанс на Heroku (пароль demo)
Ссылки на полезные материалы • • RFC 6455 Websocket Protocol Web. Sockets: a Guide Python and real-time Web Real-time Applications and will Django adapt to it? State of the Real-Time Web with Django Stateless and Proud in the Realtime World Lessons Learned Architecting Realtime Applications Django on Gevent
Вопросы?
30af39d288daa368016b6bb7eb9c36ad.ppt