Backend-разработка

Как мы ускорили Laravel API в пять раз

Ruslan Ismailov Опубликовано Обновлено 9 мин чтения
К

С чего начать оптимизацию

Оптимизацию всегда стоит начинать с измерений, а не с догадок. Прежде чем менять код, мы сняли профиль реальных запросов и нашли, что 80% времени отклика уходит на обращения к базе данных, а не на бизнес-логику. Поэтому первой целью стала именно работа с данными.

Боремся с проблемой N+1

Самой частой причиной медленных эндпоинтов оказалась проблема N+1: для списка из ста сущностей выполнялось больше сотни дополнительных запросов к связям. Жадная загрузка через with() сократила это до нескольких запросов.

Что именно мы изменили

  • Добавили eager loading для всех связей, используемых в ресурсах ответа.
  • Включили защиту от ленивой загрузки в окружении разработки, чтобы ловить N+1 на ранних этапах.
  • Вынесли тяжёлые агрегаты в отдельные оптимизированные запросы.

Кэшируем горячие данные

Редко меняющиеся справочники и тяжёлые выборки мы вынесли в Redis с продуманной инвалидацией по событиям. Это сняло значительную часть нагрузки с PostgreSQL и стабилизировало латентность под пиковым трафиком.

Резидентный режим

Финальным шагом стал запуск приложения в резидентном режиме, что убрало накладные расходы на холодную инициализацию фреймворка на каждый запрос. В сумме все меры дали пятикратное ускорение среднего времени отклика.

Итоги

Системный подход — измерить, найти узкое место, исправить и снова измерить — позволил добиться кратного ускорения без переписывания приложения. Главный урок: оптимизируйте по данным профилирования, а не по интуиции.

Технологии

Теги

Руслан Исмаилов

Senior Web / Backend разработчик. Senior web/backend разработчик с 9-летним опытом. Стек: PHP, Laravel, PostgreSQL, Redis, Docker, Kubernetes, REST, микросервисы, CI/CD. Подробнее обо мне →