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 Клиентская часть • • • • WebSockets WebSuckets (https://speakerdeck.com/3rdeden/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 со всеми репозиториями • Документация на 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 Вопросы?