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

Moscow Python Meetup №83. Максим Безруков. Python in WEB: QUIC и Rsocket. Звездная сага о протоколах.

Moscow Python Meetup №83. Максим Безруков. Python in WEB: QUIC и Rsocket. Звездная сага о протоколах.

Немного покопаемся в протоколах веб-коммуникации. Как и в каких библиотеках они имплементированы в любимом Python. Попробуем запустить этот корабль в космос или просто сыграть в камень-ножницы-бумага. Мир высокоскоростных, эффективных протоколов QUIC и RSocket, мир готов к http3.0 (или нет?)

Видео: https://youtu.be/XypSs2uhNmk

Moscow Python: http://moscowpython.ru
Курсы Learn Python: http://learn.python.ru
Moscow Python Podcast: http://podcast.python.ru
Заявки на доклады: https://bit.ly/mp-speaker

Moscow Python Meetup

July 20, 2023
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. [TOC] *table of content **как всегда 3 1. Про RSocket

    2. Посравниваем 3. Подушним 4. Полепим 5. Сделаем выводы
  2. Общая информация. 5 RSocket — это открытый двоичный протокол связи

    точка-точка, обеспечивающий семантику Reactive Streams для эффективного взаимодействия в распределенных приложениях. Он предоставляет альтернативу протоколам типа HTTP, позволяя определять, когда лучше отправлять запрос. RSocket поддерживает различные транспортные протоколы, включая TCP, WebSocket, Aeron, и HTTP/2 Stream, и имеет реализации на нескольких языках. (да - на Python тоже) Развивается c 2015 года
  3. Причины появления, aka мотивация. 7 • Модели обмена данными: что-то

    за гранью модели запрос-ответ, которая может быть неэффективной или неподходящей для некоторых сценариев в микросервисных архитектурах. • Обратное давление (backpressure): обычные протоколы не имеют встроенной поддержки обратного давления, механизма, который позволяет контролировать скорость потока данных между потребителем и отправителем. • Мультиплексирование: RSocket позволяет мультиплексировать множество потоков данных через одно сетевое соединение, что повышает эффективность использования ресурсов. • Эффективность: Бинарное кодирование вместе текста. • Возобновляемость соединений: RSocket поддерживает возобновление долгоживущих соединений, что позволяет минимизировать накладные расходы при переподключении.
  4. А почему реактивный? 8 Реактивные стримы - это спецификация для

    асинхронной обработки потоков данных с поддержкой механизма обратного давления (backpressure). В реактивных стримах источник данных управляется потребителем, который указывает, сколько данных он готов обрабатывать, избегая перегрузки. https://www.reactive-streams.org/ https://www.reactivemanifesto.org/ Манифест реактивных систем (Reactive Manifesto) описывает четыре основных принципа для создания масштабируемых, прочных и быстрых систем: Отзывчивость: Система должна быстро реагировать на действия пользователей. Устойчивость: Система должна продолжать работать нормально даже при сбоях. Масштабируемость: Система должна легко масштабироваться с ростом нагрузки. Ориентированность на сообщения: Система должна использовать асинхронную передачу сообщений для управления взаимодействием компонентов.
  5. Сочный дизайн кадров. 19 Кадр - минимальной единицей сообщения RSocket.

    • Заголовок длиной 6 байт и тела. В заголовке 4 байта представляют StreamID, 6 бит представляют тип кадра, а 10 бит представляют флаги. Структура тела варьируется в зависимости от различных типов кадров. • Если транспортный слой не поддерживает деление на кадры (например, TCP), RSocket использует uint24 из 3 байт для представления длины кадра, поэтому максимальный размер кадра составляет 16 МБ. • Если кадр превышает 16 МБ, RSocket поддерживает деление кадров и их рекомбинацию
  6. Что ещё? 22 • Можно просто так взять и поменять

    транспортный протокол • Всё хорошее от websocket по дефолту • Есть поддержка simple auth и токенов • Возобновляемость соединений • Backpressure
  7. 25

  8. Realtime-ish приложения. 26 1. Чаты 2. Мультиплеер 3. Коллаборации в

    UI 4. Real-Time задачи 5. Трекинг всего и вся 6. Тикеры всякого 7. Фиды 8. … В целом - мы ограничены только фантазией :) TCP - not for browser, but nice Websocket - love.
  9. Сравним в нагрузке? 28 Олег Докука — Протокол RSocket будущее

    реактивных приложений https://www.youtube.com/watch?v=tSVjUKZ8Eg8
  10. 29 RSocket скрывает сложность самостоятельной реализации подобного подхода. С RSocket

    нам не нужно заботиться о определении модели взаимодействия как о пользовательском протоколе и как о реализации на Java. RSocket выполняет за нас доставку данных на определенный логический канал. Он предоставляет встроенный клиент, который отправляет сообщения по одному и тому же соединению WS, поэтому нам не нужно изобретать собственную реализацию для этого. Очень радует что:
  11. 32 Повторяем мантру :) • Модели взаимодействия и по сути

    семантика • Backpressure • Мультиплексирование • Возобновляемость соединений (Resumability) • Поддержка различных транспортных протоколов • Симметричность Сама концепция - есть преимущество.
  12. Таки что будем использовать? • Python (aiohttp) • JS •

    Docker • Webpack • Сaddy попросим раздать статику и запроксирать наш сокет (раздаст ли?) • Немного мата 36
  13. Что же с любимым Python? 37 https://github.com/rsocket/rsocket-py (Библиотека Python) Документация?

    Она есть. НО - Under construction https://rsocket.readthedocs.io/en/latest/quickstart.html Гораздо лучше примеры ) https://github.com/rsocket/rsocket-py/tree/master/examples WARNING! The python package API is not stable. There may be changes until version 1.0.0. Поэтому будьте готовы страдать. • RSocketClient / RSocketServer • Transports: ◦ TCP ◦ QUIC/HTTP3(wss) ◦ Websocket aiohttp (server/client), ◦ Websocket quart (server) • Simple load balancing • Minimal integration with RxPy and reactivex • Command line interface
  14. А если web app со всеми вашими JS штуками. 45

    https://github.com/rsocket/rsocket-js (Библиотека JS) https://github.com/rsocket/rsocket-js/tree/1.0.x-alpha/packages/rsocket-examples/src (Примеры в помощь) 0.0.27 vs 1.0.x тут тоже есть нюанс
  15. А дебажить как? 53 Консольная утилита (как мы это любим)

    • Не надо использовать rsc используйте rsocket-py (утилита - клиент на python) Для браузеров (точнее только для Chrome и ему подобных) • chrome - rxcli • chrome - rsocket-frame-inspector Про error rate • Считать error rate будет сложно :) (просто error / keepAlive)
  16. 56 Выводы. • RSocket относительно нов, но уже может тягаться

    с HTTP/REST или gRPC • Не слишком Code Friendly (хочется документации - много и ещё больше) • Действительно быстрый, действительно реактивный, при правильном использовании и на хорошем топливе - будет реактивным двигателем для ваших микросервисов. • Настанет ли день когда Python разработчики будут использовать RS как и разработчики Java ?) • Потенциал - очень большой
  17. 57 Будущий протокол или протокол будущего? Когда мы уже получим

    свой трёхмерный web4.0 на квантовых сокетах?)
  18. Материалы 59 - https://rsocket.io/ (описание, протокол, примеры, этап развития) http://www.reactive-streams.org/

    (реактивщина) - https://docs.spring.io/spring-framework/reference/rsocket.html (ну если очень хочется java) - https://github.com/rsocket/rsocket-py (библиотека Python) - https://rsocket.readthedocs.io/en/latest (документация Python) - https://github.com/rsocket/rsocket-js (библиотека JS) - https://chrome.google.com/webstore/detail/rx-cli-a-client-for-testi/lpodaeljcdgnlbmmgcelekepmknmmcfm (браузер) - https://chrome.google.com/webstore/detail/rsocket-frame-inspector/nijdiakpmjaohioaelphnfdbdpbbgkhc (инспектор) - https://www.canva.dev (пример реального использования - не забудьте VPN) - https://www.canva.dev/blog/engineering/enabling-real-time-collaboration-with-rsocket/ (как canva это делает) - https://play.m3o.xyz/ (онлайн сапер - все на websocket сделано, время сделать такой же на rsocket?) - https://github.com/rsocket/bomberman-workshop (Java + Rsocket = bomberman) - https://stackoverflow.com/questions/53812515 (используйте rsocket) - https://www.youtube.com/watch?v=tSVjUKZ8Eg8 (Олег Докука Протокол RSocket — будущее)