Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

2 Безруков Максим Бэкенд разработчик (VK) Душнила t.me/entropax

Slide 3

Slide 3 text

[TOC] *table of content **как всегда 3 1. Про RSocket 2. Посравниваем 3. Подушним 4. Полепим 5. Сделаем выводы

Slide 4

Slide 4 text

4 Rsocket, что ты такое?

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

Протокол и философия. 6 Если взять “реактивные принципы” и воплотить их в протокол. Мы получим Rsocket

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

Модели взаимодействия. 9 ● Fire-and-Forget ● Request / Response ● Request / Stream ● Channel

Slide 10

Slide 10 text

Fire-and-forget. 10

Slide 11

Slide 11 text

RequestResponse. 11

Slide 12

Slide 12 text

RequestStream. 12

Slide 13

Slide 13 text

RequestChannel. 13

Slide 14

Slide 14 text

Преимущества? 14

Slide 15

Slide 15 text

15 Как оно может выглядеть? Rsocket on ws Websocket

Slide 16

Slide 16 text

Архитектура. 16

Slide 17

Slide 17 text

Можно строить всякое :) 17 Хоь по паттерну Circuit Breaker

Slide 18

Slide 18 text

Протокол на кадрах. 18

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

Имплементации. (JS, Python, Rust, etc.) 20

Slide 21

Slide 21 text

Rsocket with QUIC. 21 да

Slide 22

Slide 22 text

Что ещё? 22 ● Можно просто так взять и поменять транспортный протокол ● Всё хорошее от websocket по дефолту ● Есть поддержка simple auth и токенов ● Возобновляемость соединений ● Backpressure

Slide 23

Slide 23 text

23 Кто использует? (неполный список)

Slide 24

Slide 24 text

24 Посравниваем

Slide 25

Slide 25 text

25

Slide 26

Slide 26 text

Realtime-ish приложения. 26 1. Чаты 2. Мультиплеер 3. Коллаборации в UI 4. Real-Time задачи 5. Трекинг всего и вся 6. Тикеры всякого 7. Фиды 8. … В целом - мы ограничены только фантазией :) TCP - not for browser, but nice Websocket - love.

Slide 27

Slide 27 text

Из базовых штук. (Long pulling, SSE, WS) 27

Slide 28

Slide 28 text

Сравним в нагрузке? 28 Олег Докука — Протокол RSocket будущее реактивных приложений https://www.youtube.com/watch?v=tSVjUKZ8Eg8

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

Аналоги из классики. 30

Slide 31

Slide 31 text

Аналоги из классики. 31

Slide 32

Slide 32 text

32 Повторяем мантру :) ● Модели взаимодействия и по сути семантика ● Backpressure ● Мультиплексирование ● Возобновляемость соединений (Resumability) ● Поддержка различных транспортных протоколов ● Симметричность Сама концепция - есть преимущество.

Slide 33

Slide 33 text

33 Rsocket живет и развивается :)

Slide 34

Slide 34 text

34 Но как же проекты на Python? Грустный слайд :(

Slide 35

Slide 35 text

35 *по традиции **не реклама

Slide 36

Slide 36 text

Таки что будем использовать? ● Python (aiohttp) ● JS ● Docker ● Webpack ● Сaddy попросим раздать статику и запроксирать наш сокет (раздаст ли?) ● Немного мата 36

Slide 37

Slide 37 text

Что же с любимым 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

Slide 38

Slide 38 text

38 Server first. Можно в TLS Как и обещали (любой транспорт)

Slide 39

Slide 39 text

39 Насчет websocket.

Slide 40

Slide 40 text

40 Middleware - легко. Но есть нюанс.

Slide 41

Slide 41 text

41 Simple auth. Но токены тоже есть.

Slide 42

Slide 42 text

42 Setup frame.

Slide 43

Slide 43 text

43 Python client. Действительно просто.

Slide 44

Slide 44 text

44 Python client. Немного сложнее, когда есть route.

Slide 45

Slide 45 text

А если 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 тут тоже есть нюанс

Slide 46

Slide 46 text

App.js 46 b

Slide 47

Slide 47 text

Connector. 47

Slide 48

Slide 48 text

Request Response. 48 METADATA наша всё Без неё никаких вам routes

Slide 49

Slide 49 text

Request Stream. 49 Магия тут И да помогут вам исходники :)

Slide 50

Slide 50 text

Webpack - прекрасен. 50

Slide 51

Slide 51 text

Накидываем docker. 51

Slide 52

Slide 52 text

Наслаждаемся легкостью Caddy. 52

Slide 53

Slide 53 text

А дебажить как? 53 Консольная утилита (как мы это любим) ● Не надо использовать rsc используйте rsocket-py (утилита - клиент на python) Для браузеров (точнее только для Chrome и ему подобных) ● chrome - rxcli ● chrome - rsocket-frame-inspector Про error rate ● Считать error rate будет сложно :) (просто error / keepAlive)

Slide 54

Slide 54 text

Что внутри setup кадра? 54

Slide 55

Slide 55 text

Интроспекция кадров. 55

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

57 Будущий протокол или протокол будущего? Когда мы уже получим свой трёхмерный web4.0 на квантовых сокетах?)

Slide 58

Slide 58 text

Псевдо demo 58 https://moscowpython83.ru или https://brochat.ru

Slide 59

Slide 59 text

Материалы 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 — будущее)

Slide 60

Slide 60 text

60 Всех благ