Очереди запросов

Внутри Mapbox GL JS система загрузки данных построена вокруг централизованного механизма управления сетевыми запросами, который координирует получение тайлов, шрифтов, спрайтов и растровых ресурсов. Этот механизм формирует многоуровневую очередь, где каждый тип ресурса имеет собственную стратегию приоритизации и ограничения параллелизма.

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


Общая модель очередей запросов

Очередь запросов в Mapbox GL JS не является единой структурой. Она разделяется на несколько специализированных очередей:

  • очередь тайлов (vector / raster tiles)
  • очередь glyph (шрифтовые диапазоны)
  • очередь sprite (иконки и изображения стилей)
  • очередь источников данных (GeoJSON, raster-dem и др.)
  • очередь переиспользуемых запросов (deduplication layer)

Каждая очередь работает по принципу приоритетного планировщика, где ключевым фактором становится видимость ресурса в текущем viewport и потенциальная необходимость его в ближайших кадрах рендеринга.


Приоритетизация запросов

Система приоритетов строится на нескольких уровнях:

Пространственный приоритет

Ресурсы, попадающие в текущую область видимости карты, получают максимальный приоритет. Тайлы, находящиеся ближе к центру экрана, обрабатываются раньше периферийных.

Временной приоритет

Ресурсы, необходимые для текущего кадра рендеринга, имеют более высокий приоритет по сравнению с теми, которые потребуются в будущем при панорамировании или зуме.

Стилевой приоритет

Слои, находящиеся выше в стиле, могут влиять на приоритет загрузки их источников. Например, символические слои (symbol layers) могут запрашивать glyph раньше, чем растровые слои полностью завершат загрузку.


Очередь тайлов и управление загрузкой

Тайловая система является центральной в механизме запросов. Каждый тайл представляется как объект с уникальным идентификатором (z/x/y), который помещается в очередь загрузки при попадании в область видимости.

Очередь тайлов обладает следующими свойствами:

  • динамическое перераспределение при изменении viewport
  • отмена запросов вне зоны видимости
  • перерасчёт при изменении zoom level
  • разделение на векторные и растровые подочереди

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


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

Браузерные ограничения на количество одновременных HTTP-запросов требуют строгого контроля конкурентности. В Mapbox GL JS используется лимитированная модель выполнения запросов.

Основные принципы:

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

Это предотвращает блокировку сети и деградацию производительности при резком изменении масштаба карты.


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

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

Механизм включает:

  • таблицу активных запросов
  • кэш ключей ресурсов (tile id, sprite id, glyph range)
  • подписочную модель для слушателей результата

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


Отмена запросов и устаревание данных

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

  • запросы вне viewport помечаются как устаревшие
  • незапущенные задачи удаляются из очереди
  • активные HTTP-запросы могут быть прерваны через AbortController
  • результаты устаревших запросов игнорируются при поступлении

Особенно важно это при инерционном скроллинге и анимациях zoom, где состояние карты меняется быстрее, чем завершается загрузка ресурсов.


Кэширование и взаимодействие с очередями

Очередь запросов тесно связана с многоуровневым кэшированием:

  • memory cache для недавно использованных тайлов
  • style cache для glyph и sprite
  • HTTP cache на уровне браузера

Перед постановкой задачи в очередь выполняется проверка кэша. Если ресурс найден, он не попадает в сетевую очередь, а сразу передаётся в pipeline рендеринга.

Кэширование снижает давление на очередь и стабилизирует приоритеты загрузки.


Приоритизация тайлов в зависимости от viewport

Система использует геометрическую модель приоритизации:

  • центр экрана имеет максимальный вес
  • периферия получает линейно убывающий приоритет
  • внеэкранные тайлы имеют нулевой приоритет

При этом учитывается:

  • направление движения камеры
  • скорость pan/zoom
  • прогнозируемая зона видимости

Таким образом очередь фактически становится предиктивной.


Связь с Web Workers

В Mapbox GL JS значительная часть обработки тайлов происходит в Web Workers. Очередь запросов разделяется на две логические части:

Главный поток

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

Worker-потоки

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

После завершения загрузки тайл передаётся в worker-очередь обработки, где он преобразуется в GPU-готовые структуры.


Очередь glyph и шрифтовые диапазоны

Glyph-запросы формируются на основе используемых символов текста в текущем стиле карты. Очередь работает по диапазонам Unicode:

  • запрашиваются блоки символов, а не отдельные glyph
  • приоритет получают символы, видимые в viewport
  • повторные диапазоны объединяются в один запрос

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


Очередь sprite и изображений стиля

Sprite-ресурсы загружаются отдельной очередью, так как они:

  • используются для иконок слоёв
  • имеют статическую структуру
  • редко изменяются при навигации

Приоритет sprite-запросов ниже, чем у тайлов, но выше, чем у фоновых ресурсов. После загрузки sprite-карта кэшируется и используется всеми слоями стиля.


Перераспределение очереди при изменении масштаба

Изменение zoom level приводит к полной перестройке очередей:

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

Система стремится минимизировать повторную загрузку при плавных zoom-переходах.


Синхронизация очередей с рендер-пайплайном

Очередь запросов связана с рендер-циклом:

  • кадр рендеринга инициирует проверку готовности ресурсов
  • недостающие данные инициируют постановку задач в очередь
  • завершённые запросы активируют перерисовку слоя

Таким образом загрузка и рендеринг работают как единый асинхронный конвейер.


Обработка перегрузки сети

При ухудшении сетевых условий очередь адаптируется:

  • снижает параллелизм
  • увеличивает приоритет видимых тайлов
  • откладывает загрузку периферийных ресурсов
  • усиливает кэш-ориентированное поведение

Эта адаптация предотвращает резкое падение FPS и обеспечивает деградацию качества вместо полного отказа отображения карты.