β
Войти Регистрация

Повышение производительности приложений: стратегии оптимизации сетевых запросов

Светящиеся песочные часы из бинарного кода с трещиной в узком месте — метафора bottleneck сетевых запросов, IT Career Gym
Кейс Coinbase: меньше лишних API-вызовов — быстрее приложение и дешевле инфраструктура

English briefing for the international IT‑Career‑Gym site (itcareergym.tech). This is not a mirror of the Russian edition: the notes map the same interview topic onto global hiring loops — FAANG-style mocks, onsite loops and remote-first screens — rather than the CIS job board.

Введение

Рост криптовалютной торговли многократно увеличил число пользователей. Для бирж вроде Coinbase это резкие скачки трафика: курс может измениться за минуты, а система обязана выдержать нагрузку без сбоев. Автомасштабирование баз, CDN-кеш и нагрузочные тесты — база. Чтобы реально масштабироваться, пришлось оптимизировать сетевые запросы на уровне мобильных и веб-приложений.

В этой статье — как Coinbase сократила избыточные вызовы API на 64% в часы пик, на 30% при инициализации приложения и на 40% в критических пользовательских сценариях. Приложения стали быстрее, нагрузка на инфраструктуру и расходы на масштабирование — ниже.

Это адаптированный перевод инженерного разбора Coinbase: не разовый «ускорить экран», а системная работа с over-fetching, опросом, кешем и защитными барьерами. Подход применим к любому клиенту на GraphQL или REST.

−64%
запросов в пиковые часы
−30%
запросов при старте приложения
−40%
запросов в критических сценариях

Почему важно сокращать число сетевых запросов?

Для пользователей. Быстрая загрузка — мгновенные транзакции. Меньше данных — приложение не «плывёт» на слабых устройствах. Стабильный UX повышает доверие к сервису.

Для бизнеса. Серверы выдерживают больше одновременных клиентов. Проще растить аудиторию. Меньше машин и трафика — ниже счёт за облако.

Архитектура Coinbase

Слой данных построен на Relay и GraphQL. Клиентский запрос через шлюз попадает в резолверы — функции, которые агрегируют данные из разных API. Один такой запрос может породить от 1 до 100+ внутренних вызовов микросервисов.

Поэтому критично считать, сколько запросов рождается при холодном старте, при первичной загрузке и в ключевых сценариях: портфель, покупка, продажа. Анализ этих паттернов стал точкой входа в оптимизацию.

Три направления оптимизации

Направление Цель
Борьба с over-fetching Не тянуть лишние данные и мёртвые запросы
Пиковые нагрузки Временно отключить некритичное при всплеске трафика
Guardrails Не дать новым релизам вернуть регрессии

1. Борьба с избыточной выборкой

Лишние запросы чаще всего рождаются из неудачного API, неумеренного polling, выборки ненужных полей и мёртвого кода после A/B-тестов.

Проблема N+1 в API

На платформе много справочных данных: активы, цены, остатки. Для портфеля часто вызывали три сервиса подряд: список активов, затем цены, затем балансы. Классический N+1: вместо одного агрегированного запроса — пачка мелких.

Как решили:

  • API принимает несколько параметров за один вызов.
  • В резолверах — дата-лоадеры (пакетная загрузка).
  • Списки отдают с пагинацией.

В отдельных местах число запросов упало почти на 90%.

Грамотное использование опроса (polling)

Опрос — простой способ держать данные свежими, но он легко сжигает ресурсы, если частота слишком высокая или опрос не гасится, когда экран не в фокусе.

В React Native навигация оставляет старые экраны смонтированными. Если на главном экране опрос каждые 2 секунды по 40 запросов, а пользователь уходит вглубь стека на минуту, система сделает 1200 запросов впустую.

Рекомендации:

  • Отписываться от опроса при потере фокуса экрана.
  • Смотреть поведение: если на экране сидят меньше нескольких секунд, опрос может быть не нужен.
  • Оценивать влияние на инфраструктуру в пиковые часы.
  • Рассматривать альтернативы: WebSockets, push-уведомления, GraphQL subscriptions.

Запрос ненужных данных

  • Условные фичи (например, только для пользователей из Великобритании) — сначала проверять страну. В GraphQL для этого есть директивы @skip и @include.
  • Статичные данные вроде профиля — кешировать на клиенте.
  • Большие списки (300 активов) — резать пагинацией, а не грузить целиком.

Инструменты кеширования: адекватный TTL, GraphQL-директивы политики кеша, CDN на границе, клиентский кеш и мемоизация React-компонентов.

Очистка мёртвого кода

После A/B-тестов и удаления фич важно вычищать неиспользуемый код вместе с запросами. Coinbase использует статические анализаторы, чтобы находить мёртвые модули и сразу убирать их из продакшена.

2. Оптимизация при пиковых нагрузках

В моменты волатильности рынка Coinbase прогнозирует всплеск и автоматически включает оптимизации через конфигурационный сервис. Цель — временно отключить некритичное и разгрузить бэкенд.

Что делают:

  • Отключают упреждающую загрузку (оптимистичный fetch).
  • Увеличивают TTL кеша на клиенте.
  • Снижают агрессивность повторных попыток при ошибках.
  • Отключают неключевые фичи (акции, промо) — в сильные движения рынка ими почти не пользуются.
  • Включают облегчённые версии продуктовых функций.

В результате число запросов падает примерно на 64% без заметного ущерба для пользовательского опыта.

3. Защитные барьеры (guardrails)

Чтобы релизы не возвращали регрессии, контрольные точки стоят на всём пути: от клиента до шлюза, от GraphQL до сервисов, по типам запросов и платформам.

Новые метрики

Раньше в ключевых GraphQL-метриках не было версии приложения — сложно было понять, какая сборка просела. Добавив версию, проблемы стали ловить ещё до продакшена. Отдельная метрика — доля кешируемых операций: она подсказывает, где можно кешировать агрессивнее.

Мониторинг и аномалии

Отслеживают число запросов при инициализации, на критический сценарий и на экран.

Пример регрессии: одно новое поле без A/B-теста добавило 20+ внутренних вызовов для всех пользователей. Мониторинг поймал это на этапе разработки, команда оптимизировала вызовы между сервисами до выкатки.

Результаты и выводы

За счёт описанных подходов Coinbase получила:

  • −64% запросов в пиковые нагрузки;
  • −30% запросов при старте приложения;
  • −40% запросов в критических сценариях — это около 20% всего трафика к важнейшим сервисам.

Это дало выше стабильность и uptime, ниже расходы на инфраструктуру и возможность обслуживать больше пользователей без потери качества.

Что можно взять на вооружение любой команде?

  • Аудируйте сетевые паттерны — не только в пик, но и регулярно.
  • Боритесь с N+1 — пакетные запросы, дата-лоадеры, пагинация.
  • Скептически относитесь к опросу — отписывайтесь и ищите альтернативы.
  • Кешируйте всё, что можно — на клиенте, на границе, в CDN.
  • Внедряйте guardrails — метрики, мониторинг, контрольные точки.
  • Автоматизируйте очистку — статанализаторы, PR-чеки, AI-ревьюеры.
  • Делитесь знаниями — внутренние семинары и документация, чтобы практики жили не у одного человека.

Оптимизация сетевых запросов — не разовая акция, а непрерывный процесс. Он окупается в скорости приложений, лояльности пользователей и бюджете на облако.

Часто задаваемые вопросы

Почему важно сокращать число сетевых запросов?
Лишние запросы замедляют загрузку, расходуют трафик на слабых устройствах и нагружают инфраструктуру. Coinbase показала, что убрать избыточные вызовы API можно без потери UX: быстрее транзакции для пользователей и меньше серверов для бизнеса.
Как Coinbase сократила запросы на 64% в часы пик?
Через конфигурационный сервис на пике отключают упреждающую загрузку, повышают TTL кеша, снижают агрессивность ретраев и выключают неключевые фичи. Критичные сценарии остаются, а лишний трафик падает примерно на 64%.
Что такое over-fetching и проблема N+1 в API?
Over-fetching — запрос данных, которые экран не показывает. N+1 — когда список активов тянет отдельный вызов цены и баланса на каждый элемент. Решение: пакетные параметры, дата-лоадеры в GraphQL-резолверах и пагинация. В отдельных случаях число запросов падало почти на 90%.
Когда polling вреден в мобильном приложении?
Когда частота слишком высокая и опрос не отключается вне фокуса. В React Native старые экраны остаются смонтированными: опрос каждые 2 секунды по 40 запросов за минуту вне экрана даёт 1200 пустых вызовов. Нужно отписываться при blur и рассматривать WebSockets, push и GraphQL subscriptions.
Какие guardrails не дают регрессиям уехать в прод?
Метрики запросов при холодном старте, на экран и на критический сценарий, версия приложения в GraphQL-метриках и доля кешируемых операций. Мониторинг ловит аномалии ещё на этапе разработки, до выкатки.

← Вернуться к списку статей

Также по теме: HTTPS Git push в Bitbucket · Квизы для подготовки

Рассылка

Подписываясь, вы соглашаетесь с Политика.