Как один 'кривой' запрос чуть не уронил продакшн...

Ну, помню, была история одна, когда мы запускали новую фичу на большом e-commerce проекте. Всё шло гладко, тесты проходили, казалось, что готово к релизу.

И вот, после релиза, трафик начал расти, все отлично, цифры шли вверх. Но тут... начались странные вещи. Серверы начали дико тормозить, ответы от API замедлились до неприличия. Команда frontend уже начала паниковать потому что у них все 'сломалось'.

Мы, backend-разработчики, полезли в логи, мониторинги — и ничего критичного не видели. CPU в норме, память есть, никаких ошибок в логах. Думали, может, какой-то внешний сервис отвалился, или сеть лагает. Но нет, все внешние зависимости были доступны и работали как часы. Начали подозревать, что что-то с самим сервером веб-сайтов, может, железо подвело?

А оказалось все до банального просто. Один из пользователей, ну, или какой-то бот, сформировал абсолютно безумный SQL-запрос. Этот запрос, вместо того чтобы вернуть пару строк, пытался выбрать из таблицы практически все данные, причем делал это рекурсивно. Запрос был настолько неоптимальным, что забивал всю оперативку на одном из серверов базы данных, а потом и на остальных, вызывая цепную реакцию.

Нашли мы его случайно, когда стали просматривать самые 'тяжелые' запросы за последние часы. Это был настоящий монстр. По опыту скажу, что оптимизация запросов — это вечная головная боль, но когда дело доходит до продакшена, она становится еще и критически важной. Пришлось срочно добавить индексы, а для этого конкретного запроса — написать жёсткое ограничение по возвращаемым данным.

В итоге, проблема была решена, продакшн спасен. Но это был хороший урок: никогда не стоит недооценивать влияние даже одного, казалось бы, незначительного запроса на общую стабильность всей системы. И да, иногда frontend-щики бывают правы, когда говорят, что у нас там что-то не так, но чаще всего проблема все-таки на бэкенде кроется, ахах.

Подробнее