Лимиты запросов

В Mapbox GL JS работа карты основана на постоянном получении данных из сетевых источников: векторных тайлов, растровых тайлов, шрифтов (glyphs), стилей и ресурсов спрайтов. Каждый такой ресурс загружается через HTTP-запросы, которые проходят через инфраструктуру Mapbox и подчиняются системам квотирования и ограничениям.

Лимиты запросов формируются на нескольких уровнях:

  • ограничения тарифного плана аккаунта
  • ограничения API токена доступа
  • ограничения отдельных сервисов (tiles, geocoding, styles)
  • сетевые и браузерные ограничения параллельных соединений
  • внутренние механизмы throttling и caching в Mapbox GL JS

Ключевым аспектом является то, что Mapbox GL JS не просто отображает карту, а активно управляет потоком запросов в зависимости от текущего состояния viewport, zoom и взаимодействий пользователя.


Типы запросов, создаваемых Mapbox GL JS

Запросы векторных тайлов

Основная нагрузка приходится на векторные тайлы. При каждом изменении:

  • масштаба (zoom)
  • центра карты
  • угла наклона (pitch)
  • поворота (bearing)

формируется новый набор тайлов.

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


Запросы растровых тайлов

Растровые тайлы используются в базовых стилях или спутниковых слоях. Они:

  • тяжелее по объёму данных
  • менее гибкие
  • часто кэшируются CDN

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


Запросы glyphs (шрифтов)

Шрифты загружаются в формате PBF и кешируются по диапазонам символов. Mapbox GL JS загружает glyphs:

  • по мере появления новых языков на экране
  • при первом рендере текста
  • при изменении стиля текста

Часто именно glyph-запросы становятся причиной неожиданных 429 ошибок при большом количестве языковых данных.


Запросы спрайтов (sprites)

Спрайты содержат набор иконок для стилей карты. Они загружаются:

  • один раз на стиль
  • повторно при смене стиля

Хотя число запросов невелико, размер файлов может быть значительным.


Ограничения API и квоты

Rate limiting (429 Too Many Requests)

При превышении допустимого количества запросов сервер возвращает:

HTTP 429 Too Many Requests

Причины возникновения:

  • резкие изменения viewport (частые pan/zoom события)
  • отсутствие кеширования
  • параллельные загрузки нескольких карт
  • высокий трафик в рамках одного access token

Mapbox применяет динамическое ограничение скорости запросов, зависящее от:

  • тарифа аккаунта
  • общего потребления за период
  • типа API (Tiles API, Styles API, etc.)

Ограничения Tiles API

Tiles API имеет следующие типы ограничений:

  • количество запросов в минуту
  • количество активных сессий
  • общий объём данных

При превышении лимитов часть тайлов может:

  • не загружаться
  • загружаться с задержкой
  • возвращать ошибку 429 или 403

Ограничения Styles API

При загрузке стилей (mapbox://styles/...) действуют ограничения на:

  • частоту запросов стилей
  • количество обращений к кастомным стилям
  • размер JSON-описания стиля

Механизмы предотвращения перегрузки

Встроенное кеширование Mapbox GL JS

Кеширование реализовано на нескольких уровнях:

  • память браузера (in-memory tile cache)
  • HTTP cache (ETag, Cache-Control)
  • внутренний tile cache Mapbox GL JS

Кеш снижает число повторных запросов при перемещении карты назад к уже загруженной области.


Дедупликация запросов

Mapbox GL JS автоматически объединяет одинаковые запросы тайлов:

  • одинаковый z/x/y tile запрашивается один раз
  • параллельные обращения не создают дубликатов

Это критически снижает нагрузку при быстром перемещении карты.


Ограничение параллелизма

Встроенный loader ограничивает количество одновременных запросов:

  • тайлы загружаются пакетами
  • новые запросы ставятся в очередь
  • приоритет отдается видимой области экрана

AbortController и отмена запросов

При изменении viewport устаревшие запросы отменяются:

map.on('move', () => {
  // внутренне Mapbox GL JS отменяет нерелевантные tile requests
});

Это предотвращает накопление “мусорных” сетевых операций.


Оптимизация нагрузки на API

Управление событиями камеры

Наиболее частая причина перегрузки API — непрерывные события:

  • move
  • zoom
  • rotate

Оптимизация достигается через debounce-логику при внешних интеграциях:

let timer;

map.on('move', () => {
  clearTimeout(timer);
  timer = setTimeout(() => {
    // выполнение тяжелых операций после стабилизации карты
  }, 150);
});

Ограничение FPS

Mapbox GL JS позволяет снижать частоту перерисовки:

map.setRenderWorldCopies(false);

или через параметры производительности:

  • уменьшение maxZoom
  • ограничение renderWorldCopies
  • отключение ненужных слоёв

Минимизация источников данных

Каждый дополнительный source увеличивает число запросов. Типичные источники:

  • vector source
  • geojson source
  • raster source

Оптимизация заключается в:

  • объединении слоёв
  • уменьшении количества источников
  • использовании одного vector tileset вместо нескольких GeoJSON

Поведение при превышении лимитов

Повторные попытки (retry)

Mapbox GL JS автоматически выполняет retry:

  • с экспоненциальной задержкой
  • ограниченное количество попыток
  • только для временных ошибок

Экспоненциальный backoff

Типичная схема задержек:

  • 1 попытка: сразу
  • 2 попытка: +100–200 мс
  • 3 попытка: +400–800 мс
  • дальнейшие попытки увеличиваются нелинейно

Деградация качества отображения

При перегрузке системы возможно:

  • временное исчезновение слоёв
  • снижение детализации тайлов
  • задержка обновления текста

Ограничения токена доступа

Access token определяет:

  • доступные API
  • лимиты запросов
  • привязку к аккаунту

При некорректной настройке токена возможны ошибки:

  • 401 Unauthorized
  • 403 Forbidden
  • ограничение доступа к tiles/styles

Токен также участвует в мониторинге злоупотреблений, включая:

  • резкое увеличение запросов
  • подозрительную активность
  • превышение географических квот

Влияние пользовательской активности

Интенсивность запросов напрямую зависит от поведения:

  • резкое масштабирование увеличивает tile burst
  • частое перемещение вызывает перегрузку очереди загрузки
  • многократное создание/уничтожение карты приводит к повторной инициализации всех ресурсов

Особенно чувствительны сценарии с:

  • анимацией камер
  • синхронизацией нескольких карт
  • live tracking объектов

Сетевые ограничения браузера

Помимо Mapbox API существуют ограничения:

  • лимит одновременных соединений на домен (обычно 6–8)
  • приоритизация HTTP/2 потоков
  • ограничение памяти под кеш

Эти ограничения приводят к тому, что Mapbox GL JS управляет очередью запросов независимо от сервера.


Стратегии устойчивой работы при высоких нагрузках

Предзагрузка тайлов

Используется для сглаживания нагрузки:

  • загрузка соседних тайлов заранее
  • прогрев зон интереса
  • использование setCenter без анимации

Использование минимального стиля

Упрощение style JSON:

  • удаление неиспользуемых слоёв
  • сокращение sprite atlas
  • уменьшение количества glyph ranges

Ограничение частоты обновлений источников

При работе с динамическими данными:

  • обновление GeoJSON не чаще определённого интервала
  • батчинг изменений
  • замена частых setData на агрегированные обновления

Мониторинг и диагностика лимитов

Network panel браузера

Основные метрики:

  • количество запросов tiles
  • статус 429/403
  • время ответа CDN
  • повторные попытки загрузки

Mapbox telemetry

Система фиксирует:

  • количество tile requests
  • bandwidth usage
  • error rates
  • token-level consumption

Логика внутреннего tile queue

Mapbox GL JS использует очередь с приоритетами:

  • видимые тайлы — высокий приоритет
  • вне экрана — низкий приоритет
  • устаревшие — отменяются

Взаимодействие лимитов и производительности

Лимиты запросов напрямую связаны с производительностью:

  • снижение числа запросов уменьшает latency
  • агрессивный кеш увеличивает отзывчивость карты
  • чрезмерное количество источников увеличивает вероятность throttling

Баланс достигается через управление:

  • количеством слоёв
  • плотностью тайлов
  • скоростью пользовательских взаимодействий