(презентации).

advertisement
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
Вопросы?
Download