TGViewer
@davidobryakov @davidobryakov @davidobryakov · 638 subscribers
Post #1230 565
Оптимизация работы эндпоинта

Часто так бывает, что новые фичи заводятся итерационным путём и сначала в формате "лишь бы оно работало". Со временем, когда руки для следующей итерации высвобождаются, появляется желание подобные фичи порефакторить.

Одну такую фичу я завёз на продакшн около полутора месяцев назад, а на этой неделе наконец-то дошли руки до оптимизации.

Проект ещё только находится на пути к выходу из MVP, но уже имеет несколько активных клиентов, данные которых прилетают к нам на сервера 24/7.

Кратко о сути проблемы:

- мне надо было динамически рассчитывать статус текущего состояния некой установки, этих установок может быть несколько;
- в первой итерации статус рассчитывался через python и сохранялся в БД в момент совершения запроса на его получение.

Путь улучшения перфоманса выглядел так:

- я отрефакторил всё вручную и ускорил работу метода с 30 секунд до 12 секунд;
- я сходил в GPT, он отрицательно ускорил метод с 12 секунд до 20 секунд;
- я начал делать фоновый предрасчёт через celery и сократил тем самым работу метода аж до 68мс;
- количество данных в БД увеличилось (за 3 дня насоздавалось свыше 40 тысяч записей со статусами) и работа эндпоинта замедлилась до 40 секунд;
- я начал записывать результат предрасчёта в redis и вновь вернул время работы к значению в районе ~100мс.

Как можно было бы решить это иначе?

Вынести предрасчёт на уровень postgres (в другом месте этого же проекта уже есть view, которая динамически рассчитывает некоторые показатели), но поскольку накручивать триггеры в БД я не очень хочу, а сохранять новые статусы для истории и обновлённой инфографики может быть важно, было принято именно то решение, о котором я написал выше.

Какой вывод я для себя сделал?

Задним умом я понимаю, что не просчитал основной риск: количество записей может стать довольно большим за короткий срок и это отрицательно скажется на общей производительности эндпоинта.
Teletype Оптимизация работы эндпоинта Часто так бывает, что новые фичи заводятся итерационным путём и сначала в формате "лишь бы оно работало". Со временем, когда руки для...
  • ❤ 9
  • 🔥 2
  • 🤝 1
More from @davidobryakov
  1. May 24, 2025Настраиваем автодокументирование для express-приложений Читать полностью: https://blog.kan…
  2. May 13, 2025Основные паттерны микросервисной архитектуры: Strangler Fig, API Gateway, Service Mesh и д…
  3. May 11, 2025Поиск мотивации в скучных задачах Частенько бывает, что нехватка мотивации для решения чег…
  4. May 10, 2025Переход с Python на Go и мысли о высшем образовании / ч. 3 Пост в блоге: https://blog.kant…
  5. May 10, 2025Переход с Python на Go и мысли о высшем образовании / ч. 2 Пост в блоге: https://blog.kant…
  6. May 10, 2025Переход с Python на Go и мысли о высшем образовании / ч. 1 Пост в блоге: https://blog.kant…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →