Перформенс оптимізації @Donate1024Bot

Того тижня на обіді колега топ-донатер поскаржився що хотів подивитися на графік наповнення монобанки, але він не намалювався. Ось—https://donate1024.org/posts/126.

Я знав що використовується неоптимальне рішення для зберігання даних, але поки зборів було мало, то це не було помітним а зараз вилізло, тому я вирішив це виправити.

Перша проблема: я зберігав дуже багато зайвих даних. Монобанки скрапились щоп'ятнадцять хвилин. На кожну банку зберігався датапоїнт з відміткою коли він був зроблений та сумою. Таким чином кількість точок росла лінійно від часу та наявних зборів.

Друга проблема: головна сторінка https://donate1024.org при завантаженні відображала всі монобанки зі всіма графіками.

Третя проблема: графіки малювалися за весь період збору даних. Якщо збір додали місяць тому, то для побудови графіку збиралися всі точки взагалі. Тобто, головна завантажувала взагалі все і фактично робився фулл скан таблиці з точками.

Почав з першого. Тут все виявилося досить простим. Спочатку я змінив інтервал апдейтів банок з 15 хв на 30 хв. Потім, замість того щоб писати кожну точку, я дивився—якщо значення банки не змінилося, то я просто оновлював дату попередньої точки. Таким чином якщо збір стоїть, то я не марную місце на однакові точкі. Після того написав джобу яка пройде по всім банкам та видалить зайві точки. Було 150 000 точок, після прогону скрипта залишилося 5 000. Це одне вже дуже суттєво пришвидшило роботу сайту.

Другу задачу я теж вирішив просто. Замість того щоб синхронно малювати всі графіки я зробив так, щоб вони завантажувались коли стають видимими для користувача. Тобто якщо юзер недоскроллив до зборів, то нічого й не буде обчислюватися. На Rails це робиться без жодного рядка JS, просто загортаєте графік у т.з. turbo-frame і він сам подбає про те щоб зробити запит на бекенд та замінити ним відповідний шматочок HTML на сторінці.

Третю проблему я ніяк не вирішив і залишив все як є. Коли кількість точок радикально скоротилась, то запити стали відпрацьовувати значно швидше. Тому я відклав це на наступні місяці і зараз просто відображаю графік монобанки за весь період коли збиралися дані.

В результаті p0.99 знизився з 1000 мс до 500 мс та пропали всі піки більше 1с, коли запит попадав на холодний кеш.

P.S.: fly.io додали графану з графіками по cpu/ram та http response time/codes для всіх сервісів тому там наочно видно що стало краще. Дуже крута фіча, не треба нічого самому конфігурити. Я би вам показав картинку але зась.


Сподобалось? Долучайтеся до мого телеграм каналу: https://t.me/full_of_hatred