Этот вопрос проверяет способность отличать ограничения инфраструктуры/кода от системных архитектурных проблем: данных, интеграций, зависимостей и потоков обработки.
Часто тормозит не фреймворк, а то, как устроены вызовы и данные: последовательные внешние запросы, N+1 к базе, тяжёлые вычисления в обработчике, отсутствие кеша и деградация зависимостей. Если latency уходит во внешние сервисы или БД, смена фреймворка почти ничего не даст. Архитектурная проблема — это когда нужно менять границы ответственности, протоколы, модель хранения или поток обработки. Фреймворк влияет меньше, чем дизайн взаимодействий. Поэтому сначала ищут реальные узкие места по метрикам и трассировкам.
Правильный диагноз начинается с понимания, где реально тратится время: в CPU, в I/O, в очередях или во внешних зависимостях.
Архитектурная проблема производительности — это ограничение, вызванное структурой компонентов и их взаимодействиями (данные, зависимости, последовательность шагов), а не конкретной веб-обвязкой.
Ниже — типовые случаи, когда миграция на другой фреймворк почти не меняет картину:
Последовательные внешние вызовы
сервис делает 5–10 HTTP-запросов по цепочке
общий latency ≈ сумма ожиданий
N+1 и плохие запросы к БД
много мелких запросов вместо одного батча/джойна
отсутствие индексов, тяжёлые сортировки/фильтры
Неправильная модель данных
чтение “широких” сущностей, лишние поля/джойны
нет денормализации там, где она оправдана
Отсутствие кеша или неверный кеш
одинаковые запросы постоянно пересчитываются
TTL не соответствует бизнес-реальности
Тяжёлые операции в request-path
генерация отчётов, большие сериализации, компрессия
операции, которые лучше вынести в фон
Неуправляемые ретраи и каскадные отказы
при сбое зависимости система начинает “долбить” её сильнее
Ограничения внешних сервисов
rate limits, квоты, платные лимиты, долгие ответы
Сначала нужно одно связное предложение: подтверждение делается измерениями, а не догадками.
Трассировка (distributed tracing)
видно, сколько времени ушло на БД/HTTP/очереди
Метрики
p95/p99 latency, saturation воркеров, pool connections, error rate
Профилирование
если CPU низкий, а latency высокий — вероятно I/O/очереди/зависимости
def handler():
user = db.get_user(user_id)
# N+1: для каждого элемента — отдельный запрос
items = [db.get_item(i) for i in user.item_ids]
return items
Здесь смена фреймворка не устранит N+1 — нужен батч/запрос другим способом.
Параллелизм внешних вызовов + лимитирование
Кеширование (Redis, in-process, CDN — по контексту)
Асинхронные пайплайны (очереди, фоновые воркеры)
Оптимизация запросов/индексов и пересмотр модели данных
Circuit breaker / backpressure для защиты от каскадов
Если время уходит в зависимости, БД, очереди, последовательные шаги или тяжёлую бизнес-обработку, то проблема в архитектуре. В таких случаях смена фреймворка даёт небольшой эффект по сравнению с переработкой потоков данных и взаимодействий.