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

Я ускорил всё, кроме себя

Я ускорил всё, кроме себя

В своём докладе я даю слушателям самый полный и понятный список лучших решений для всего в бэкендах. Это небольшая энциклопедия лучших решений, многие из которых я и коллеги как следует «притёрли» в продакшене. Фреймворки, библиотеки, сервера, даже немного десктоп софта, сравнения — будет всё, а на что-то мы и вовсе посмотрим с неожиданных сторон. И многое из этого быстрое!

https://pycon.ru/ya-uskoril-vsyo-krome-sebya

Denis Anikin

July 28, 2024
Tweet

More Decks by Denis Anikin

Other Decks in Programming

Transcript

  1. Что я такое? — Я техлид/комьюнити лид — fullstack, python,

    typescript, devops, микросервисы, kubernetes — Выступаю на конференциях — Отвечаю за внутреннее сообщество питонистов https://xfenix.ru 2 Кто я?
  2. Э? Но оно же итак быстрое? Эволюция софта 2 Всё

    быстрое, да ещё и ускоряется каждый релиз
  3. Тревожный слайд — Весь софт все быстрее и быстрее —

    Нейросети нас заменяют (если верить газетам) — Ускоряются даже сами языки — Когда не хватает и этого, появляются более быстрые языки — Одни мы не ускоряемся…
  4. Что выбираем — Все python- и backend- связанное (библиотеки, фреймворки)

    — Инфраструктура — Тулы для разработки — Тулы для качества кода
  5. Где скорость? — В параллелизации/в скорости доставки ценности — Тесты

    изначально должны быть параллельными Backend > Тесты > Pytest
  6. Как это выглядит @dataclass class Person: name: str age: float

    height: float weight: float class PersonFactory(DataclassFactory[Person]): __model__ = Person def test_is_person() -> None: person_instance = PersonFactory.build() assert isinstance(person_instance, Person)
  7. Мои выводы такие — schemathesis’у не место рядом с тестами

    в кодовой базе — лучше всего его приземлять в е2е тесты и натравливать на уже готовую тестовую среду Backend > Тесты > Schemathesis
  8. Почему отказались — Не очень нравилась дока — В реальных

    жизненных сценариях декораторы сильно раздувались Backend > Ретраи
  9. Как это выглядит def fatal_code(e): return 400 <= e.response.status_code <

    500 @backoff.on_exception(backoff.expo, requests.exceptions.RequestException, max_time=300, raise_on_giveup=False, giveup=fatal_code) def fetch_something(url): return requests.get(url)
  10. Как это выглядит @stamina.retry(on=httpx.HTTPError, attempts=3) def do_it(code: int) -> httpx.Response:

    resp = httpx.get(f"https://httpbin.org/status/{code}") resp.raise_for_status() return resp
  11. Минутка рекламы — Если вы пишете без ретраев, то попробуйте

    их внедрить — Любой запрос к внешнему ресурсу имеет смысл повторять (http запрос, запрос в любую базу, любой сетевой запрос, отправка в mq, чтение из mq и т.п.) — Повторы имеет смысл повторять через экспоненциальное время — Повторы всегда стоит ограничивать в количестве Backend > Ретраи
  12. Почему у нас litestar — умолчание — Как fastapi, только

    лучше — Умеет из коробки работать с базой — DTO — Контроллеры — Кеши, сторы — Каналы — <...> Backend > Фреймворки C алхимией
  13. Скорость — Как fastapi, только чуть быстрее — (Возможно) проигрывает

    blacksheep — Мы «дорабатываем» связкой с granian Backend > Фреймворки
  14. EDA

  15. Как это выглядит broker = KafkaBroker("localhost:9092") app = FastStream(broker) class

    User(BaseModel): user: str = Field(..., examples=["John"]) user_id: PositiveInt = Field(..., examples=["1"]) @broker.subscriber("in") @broker.publisher("out") async def handle_msg(data: User) -> str: return f"User: {data.user} - {data.user_id} registered"
  16. DI

  17. Качество кода — Очень базово — ruff check в режиме

    «черного списка» (включено все, погашено немного) в вашем CI/CD — ruff format — mypy — trivy
  18. Неочевидное про шаблоны — Не стоит класть много кода в

    шаблон — Повторяемый код лучше выделить в библиотеку (у нас такая есть, microbootstrap) — Для обновления проектов из нового кукикаттера есть scaraplate — Можно посмотреть так же на nitpick Backend > Разное
  19. Скорость — mpire > multiprocessing — structlog + memory handler

    > все остальное логгирование — aiorun и кукикаттер про быстрое написание кода — с httpx неоднозначно (медленнее aiohttp, но полнее либа) Backend > Разное
  20. NO

  21. Почему — Лучше rps — Лучше latency — Нет проблем

    — Ну… rust Backend > APP сервер > Granian
  22. Зачем мне devops штуки — DevOps — не человек… —

    …а 100 килограмм ценных технологий — …набор практик :) — dev + ops == любовь
  23. — Двойная лицензия начиная с 2024 (SSPL) — Неоднозначная ситуация

    с SSPL — Необновляемый старый редис со старой лицензией — Общая неуверенность глобального сообщества — Отдельный форк от linux foundation — valkey 121 Почему меняем redis Infra > inmemory
  24. Valkey — Форк редиса 7.2 — Очень туманная документация (похоже,

    что «redis» поменяли на «valkey») — Всё тоже самое (но с очень-очень-очень светлым будущим) 124 Infra > inmemory > Valkey
  25. Garnet — Опять лучше всех — Сделан на C# —

    Ultra-low-latency (300 микросекунд!) 128 Infra > inmemory > Garnet
  26. 130 Introduction to Tsavorite Garnet’s storage layer, called Tsavorite, was

    forked from our prior open-source project FASTER. Tsavorite includes strong database features such as thread scalability, tiered storage support (memory, SSD, and cloud storage), fast non-blocking checkpointing, recovery, operation logging for durability, multi-key locking and transaction support, and better memory management and space reuse. Infra > inmemory > Garnet
  27. 131

  28. Dragonfly — Как redis, но лучше вообще во* всём** —

    Разработчики redis, кстати, обиделись и написали «13 Years Later — Does Redis Need a New Architecture?» — У них лучше trhoughput, эффективность хранения в памяти, эффективность хранения на диске, shared nothing, VLL, dash подход для хешей, fork-less снапшотинг — Умеет быть кластерным 134 *, ** По мнению разработчиков dragonfly Infra > inmemory > Dragonfly
  29. MQ

  30. Скорость — Nats jetstream в простых тестах достигает 270к на

    паб, 777к на саб — Kafka (от 10к qps до 2кк qps в зависимости от бенчмарка) 146 Infra > MQ
  31. Всё просто — Аутентификация — единообразна в организации (чаще всего)

    — Вы не хотите писать очередной токен менеджмент — Тонна интеграций — Авторизация — специфична Infra > Аутентификация > Keycloak
  32. Как это выглядит { "keys": [ { "kty": "RSA", "e":

    "AQAB", "x5t": "NjU3NDI5ZTZhODU0YjQzMGFiYzk…", "use": "sig", "kid": "e600c72b-125a-4b30-86a5-9697af62f2a1", "x5c": [ "MIICujCCAaKgAwIBAgIECI8fsTANBgkqhkiG9w0BAQ..." ], "alg": "RS256", "n": "lzRszUeQ4WiSq..” }, … ] }
  33. Собираем вместе — Apisix — Keycloack — https://apisix.apache.org/docs/apisix/plugins/openid-connect/ — Получаем

    всю авторизацию только на инфре Infra > K8S ingress controller > Apisix