Centrifuge – мгновенные сообщения для веб-приложений. Эволюция от Python к Go. Александр Емелин, 2015.
О докладчике Работаю в Mail.Ru Group, участвую в разработке внутренних и некоторых внешних сервисов компании Пишу на Python и иногда на Javascript С недавних пор полюбил еще и Go Профиль на Github –
Мгновенные (real-time) сообщения? Сообщение о неком событии, доставленное в браузер клиента моментально после того, как бэкенд приложения узнал о событии Никакой перезагрузки страницы и периодических AJAX- запросов, только push Менее чем за 250 мс
С чего всё начиналось Корпоративный интранет – Server-Sent Events, Twisted (Cyclone) для мгновенных сообщений Неудавшаяся идея агрегатора (Sentry для всего) Wait for it… Centrifuge
Клиентская часть WebSockets WebSuckets ( Полифиллы к WebSockets – Socket.io, SockJS и другие Pub/Sub библиотека – для удобного менеджмента каналов
Серверная часть Django, Flask… Если мы говорим о Python Django-подобные фреймворки в других языках программирования Как быть?
Пути решения Переписать всё на Asyncio, Tornado или подобном асинхронном фреймворке. Или другом языке (Javascript, Go, Erlang) Gevent подход WebSocket 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-20x) Использование нескольких ядер одновременно Встроенная в язык concurrency-модель - горутины, возможность использовать все доступные библиотеки без необходимости поиска неблокирующих На выходе один исполняемый файл под все платформы Проблемы с Tornado Проще вносить изменения в код
Марафон коммитов длиной в 2 месяца
Другие плюсы Go, обнаружившиеся в процессе Конфигурация – Viper Просто тестировать Race detector Debug – возможность в рантайме пронаблюдать за жизненным циклом горутин
И еще одна деталь Удалось выделить real-time ядро Центрифуги в отдельный модуль, который можно использовать извне
Ссылки на проект Организация Centrifugal на Github со всеми репозиториями Организация Centrifugal на Github Документация на gitbooks.io Документация Демо-инстанс на Heroku (пароль demo)Демо-инстанс
Ссылки на полезные материалы RFC 6455 Websocket Protocol WebSockets: 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
Вопросы?