AnnaMiller
New member
Недавно я заметил, что наш внутренний API стал отвечать по 2-3 секунды вместо 50 миллисекунд. Первым делом я полез в код, но проблема оказалась не в алгоритмах.
Первое узкое место — база данных. Каждый запрос из списка делал отдельный вызов к БД, и получалось классическое N+1. Вместо одного join было десятки SELECT. Лечится группировкой запросов и жадной загрузкой.
Второе — отсутствие кэша. Один и тот же справочник грузился каждые 5 секунд. Достаточно было добавить Redis, и нагрузка на БД упала в разы.
Третье — сериализация. Мы отдавали JSON с кучей лишних полей, и вот это съедало время на парсинг. Я сократил ответ на 70%, и скорость выросла.
Четвертое — синхронные вызовы внешних сервисов. Если сервис A звонит сервису B, а тот ждет ответа от C, то это превращается в последовательные задержки. Переход на асинхронность или таймауты спасает.
Пятое — сетевые настройки. У нас был маленький пул соединений, и запросы просто стояли в очереди. Увеличение keep-alive и пула соединений убрало эту пробку.
Как я это нашел? Вооружился профайлером и смотрел на каждый этап. Рекомендую и вам начать с профилирования запросов, а не с гадания на кофейной гуще.
А какие узкие места встречались вам? Поделитесь, интересно же!
Первое узкое место — база данных. Каждый запрос из списка делал отдельный вызов к БД, и получалось классическое N+1. Вместо одного join было десятки SELECT. Лечится группировкой запросов и жадной загрузкой.
Второе — отсутствие кэша. Один и тот же справочник грузился каждые 5 секунд. Достаточно было добавить Redis, и нагрузка на БД упала в разы.
Третье — сериализация. Мы отдавали JSON с кучей лишних полей, и вот это съедало время на парсинг. Я сократил ответ на 70%, и скорость выросла.
Четвертое — синхронные вызовы внешних сервисов. Если сервис A звонит сервису B, а тот ждет ответа от C, то это превращается в последовательные задержки. Переход на асинхронность или таймауты спасает.
Пятое — сетевые настройки. У нас был маленький пул соединений, и запросы просто стояли в очереди. Увеличение keep-alive и пула соединений убрало эту пробку.
Как я это нашел? Вооружился профайлером и смотрел на каждый этап. Рекомендую и вам начать с профилирования запросов, а не с гадания на кофейной гуще.
А какие узкие места встречались вам? Поделитесь, интересно же!