Как искать и ускорять проблему долгой обработки запроса в мобильном приложении
Что проверяют
Умеете ли вы искать причину измерениями, а не догадками. Запрос из мобильного клиента проходит через устройство, сеть и сервер, и хороший ответ начинается с того, как разложить общее время по этим участкам. Следом обычно просят рассказать, что конкретно вы находили в своей практике.
Как отвечать
Каркас такой: воспроизвести и измерить, найти участок, исправить, подтвердить цифрами.
- сквозная трассировка: OpenTelemetry на клиенте и в ASP.NET Core, заголовок
traceparentсвязывает запрос с устройства со спанами на сервере и в базе. Сразу видно, куда ушли секунды: DNS и TLS, ожидание ответа, десериализация; - сервер:
dotnet-countersдля пула потоков и GC,dotnet-traceили dotTrace для горячих методов, лог SQL из EF Core, где видны N+1 и запросы мимо индекса; - клиент: профайлер платформы (Android Studio Profiler, Instruments в Xcode) для приложения на .NET MAUI, чтобы проверить, не блокируется ли UI-поток и сколько стоит разбор JSON;
- метрики из продакшена: перцентили p95 и p99 по реальным устройствам и типам сети, а не среднее на Wi-Fi разработчика.
Типичные находки и лечение. На сервере синхронное ожидание .Result или .Wait() вызывает голодание пула потоков, а new HttpClient() на каждый вызов соседнего сервиса исчерпывает сокеты, нужен IHttpClientFactory. Ответ на мегабайты лечится пагинацией, сжатием Brotli или gzip через AddResponseCompression и выборкой только нужных полей. Повторные запросы снимаются кэшем и ETag. На клиенте разбор JSON ускоряет System.Text.Json с source generator. После правки сравните те же перцентили, иначе улучшение не доказано.
Где спотыкаются
Начинают оптимизировать код, не измерив, и неделю ускоряют метод, который занимает пять процентов времени.
Смотрят среднее время ответа. Жалобы пользователей живут в хвосте распределения: медиана 200 мс может соседствовать с p99 в восемь секунд.
Проверяют только на эмуляторе и быстрой сети. На реальном устройстве в мобильной сети задержка и потери пакетов другие, и цепочка последовательных запросов на один экран становится главной проблемой.