FastAPI — то, на чём я делаю почти все свои бэкенды. Его хвалят за «асинхронность». Объясню что это, без терминов, на одной картинке — и расскажу про ошибку, из-за которой я однажды полночи не спал.
Представь кассу. Обычный сервер — это кассир, который ведёт одного человека от начала до конца: пробил, ждёт пока тот достанет карту, введёт пин, оплатит, упакует — и только потом зовёт следующего. Если у человека карта не считывается, вся очередь стоит и злится.
Асинхронный сервер — это кассир, который, пока ты роешься в кошельке, успевает пробить товар следующему. Никто не ждёт впустую. Для сайта или бота это значит: сто человек обращаются одновременно, и всех обслуживают, не зависая на самом медленном.
И вот главная ошибка. Если внутри такого «ловкого» кассира вставить одну операцию, которая всё-таки заставляет его замереть и тупо ждать — он замирает целиком. Не для одного человека. Для всех ста сразу. Сервер делает вид что быстрый, а по факту встал колом, и ты под нагрузкой ловишь необъяснимые тормоза.
Самое коварное — на тестах этого не видно. Один ты сидишь — всё летает. Приходит реальная нагрузка — и проект ложится, хотя «вроде всё асинхронное». Лечится тем, что вообще все долгие операции внутри — запросы к чужим сервисам, к базе, к файлам — тоже должны быть «ловкими», а не блокирующими. Одно медленное звено убивает весь смысл.
Звучит как мелочь. Но именно эта мелочь — причина половины «непонятных тормозов» на молодых проектах. Свою я выловил ночью на проде. Теперь проверяю первым делом.
