diff --git a/case_stady.md b/case_stady.md new file mode 100644 index 0000000..7a1345f --- /dev/null +++ b/case_stady.md @@ -0,0 +1,40 @@ +## О проекте +Проект является одним из энджинов для вэб-казино. Выполняет роль как админки для конфигурации игр, так и непосредственно backend логики этих игр. +Предоставляет API для игрового клиента. + +Архитектурно является большим монолитом. +Взаимодействует с другими энджинами посредством Kafka, RabbitMQ и GCP PubSub. +Поддерживает одновременно Postgresql и MySQL. Для работы с кэш используем Redis, Memcache. Фоновые задачи - Sidekiq. +Проект доккеризирован. Для мониторинга используется NewRelic и Grafana/Prometheus. +*** +Я являюсь backend разработчиком и работаю на проекте около двух лет. +Самому проекту уже около 10 лет. + + +## Актуальная проблема +Явных проблем с перформансом в логике проекта не наблюдается. Стараемся своевременно выявлять и фиксить ботлнеки. + +Однако давно назрела необходимость ускорить выполнение тестов. +Я уже занялся этим в задании №7 и как промежуточный результат ускорил прохождение тестов на 40% с 6мин 30сек до 4мин. +Очень полезно было использовать `test-prof`. Вижу перспективу снять еще 1мин с времени прохождения тестов после устранения всех каскадов фабрик и устранению ненужных запросов к базе. +*** +Из интересных кейсов, вчера изучал NewRelic статистику проекта на предмет поиска целей для оптимизации. В первую очередь обратил внимание на первую строчку из топа `By most time consuming` операций баз данных - `Account.find(45%) - 48k per.m.`. + +Уточнил что 96% этих запросов приходится на аналогично первую строчку в топе транзакций. Показалось очень странным такое количество данных запросов `Account.find` + +Изучив трэйс, нашел в коде строчку вида: + +`created_at = attributes.fetch(:some_key, Account.find(...)&.created_at)` + +Как правило в 90% случаев ключ со значением присутствует и триггериться запрос в бд не должен. +Но видимо коллега писавший этот код не учел особенностей работы `.fetch`, который триггерил нам `Account.find` в независимости от ключа. + +Вынес запрос из парметра в блок: + +`created_at = attributes.fetch(:some_key) { Account.find(...)&.created_at }` + +Таким образом образом избавился от большого количества ненужных запросов. +Пока не довел коммит до production, но по моим подсчетам только за счет этой +оптимизации нагрузка на базу снизится на от 30% до 40%. +*** +В планах исследовать на досуге другие нагруженные транзакции. \ No newline at end of file