CDN и хостинг тайлов

CDN в архитектуре тайлов

В веб-картографии производительность определяется не только клиентским рендерингом, но и тем, как быстро доставляются тайлы. При использовании OpenLayers основной нагрузкой становится загрузка плиток (tiles), которые формируют карту по принципу пирамиды масштабов. Именно здесь CDN становится ключевым элементом инфраструктуры.

CDN (Content Delivery Network) распределяет статические ресурсы по географически разнесённым узлам. Тайлы карты — идеальный кандидат для кэширования: они неизменяемы в рамках конкретного zoom/x/y адреса и могут храниться на edge-серверах без дополнительной логики генерации.

Типовая схема доставки тайлов:

  • клиент запрашивает tile /z/x/y.png
  • запрос попадает на ближайший CDN-узел
  • при попадании в cache hit тайл возвращается мгновенно
  • при cache miss CDN обращается к origin-серверу
  • результат сохраняется в edge-кэше

Ключевая особенность тайлового контента — высокая степень повторяемости запросов. Один и тот же тайл часто запрашивается тысячами пользователей, особенно в популярных масштабах (z=10–14). Это делает CDN не просто оптимизацией, а обязательным элементом архитектуры.


Хостинг растровых тайлов

Растровые тайлы представляют собой изображения (PNG, JPEG, WebP), заранее сгенерированные на сервере. Они часто используются в классических картографических стилях.

Источники растровых тайлов делятся на несколько типов:

  • публичные проекты (например, OpenStreetMap в связке с различными tile-серверами)
  • коммерческие провайдеры (например, Mapbox)
  • self-hosted решения (TileServer GL, GeoServer, Mapnik рендеринг)

При использовании CDN важно учитывать:

  • Cache-Control headers

    • max-age для тайлов часто выставляется на годы
    • immutable позволяет исключить повторную валидацию
  • Версионирование стилей

    • изменение карты должно сопровождаться сменой URL (например /v2/tiles/)
  • Формат изображений

    • PNG — точность и прозрачность
    • JPEG — меньший размер, отсутствие прозрачности
    • WebP — компромисс между качеством и размером

В OpenLayers растровый слой обычно подключается через ol/source/XYZ:

import TileLayer from 'ol/layer/Tile';
import XYZ from 'ol/source/XYZ';

const layer = new TileLayer({
  source: new XYZ({
    url: 'https://cdn.example.com/tiles/{z}/{x}/{y}.png'
  })
});

CDN в данном случае выступает как прозрачный ускоритель доставки, не требующий изменений на стороне клиента.


Кэширование и географическая локальность

Эффективность CDN для тайлов определяется не только TTL, но и пространственной локальностью данных. Карта обладает сильной пространственной корреляцией: пользователь, перемещаясь по карте, запрашивает соседние тайлы.

Это создаёт предсказуемые паттерны:

  • при pan влево/вправо запрашиваются соседние x-координаты
  • при zoom — весь набор тайлов нового уровня
  • при инерционном перемещении — линейные цепочки запросов

Edge-кэш CDN учитывает эти паттерны, обеспечивая высокую вероятность cache hit после первичной загрузки области.

Дополнительно применяются:

  • prefetch соседних тайлов (на уровне клиента OpenLayers)
  • HTTP/2 multiplexing для параллельных загрузок
  • brotli/gzip для vector tiles

Хостинг векторных тайлов

Векторные тайлы отличаются тем, что вместо изображения передаются структурированные данные (обычно Mapbox Vector Tile формат). Это существенно меняет роль CDN.

Векторные тайлы:

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

В OpenLayers такие источники подключаются через VectorTileSource:

import VectorTileLayer from 'ol/layer/VectorTile';
import VectorTileSource from 'ol/source/VectorTile';
import MVT from 'ol/format/MVT';

const vectorLayer = new VectorTileLayer({
  source: new VectorTileSource({
    format: new MVT(),
    url: 'https://cdn.example.com/vector/{z}/{x}/{y}.pbf'
  })
});

При использовании CDN для vector tiles важны дополнительные факторы:

  • сжатие PBF (gzip/brotli обязательно)
  • корректные MIME-типы (application/x-protobuf)
  • агрессивное кеширование на edge
  • контроль версий стилей, так как один и тот же тайл может отображаться по-разному

Разделение origin и CDN в тайловой инфраструктуре

Архитектура обычно делится на два уровня:

Origin-сервер

  • генерация тайлов
  • доступ к геоданным (PostGIS, GeoTIFF, OSM extracts)
  • рендеринг (Mapnik, Tegola, TileServer)

CDN слой

  • глобальное кэширование
  • TLS termination
  • защита от DDoS
  • оптимизация доставки

Популярные CDN-платформы:

  • Cloudflare
  • Amazon Web Services (CloudFront)
  • Fastly

Важный принцип: CDN не должен участвовать в генерации тайлов. Любая динамика должна быть на origin, иначе кэш становится непредсказуемым.


TTL стратегия и инвалидация тайлов

Так как тайлы статичны по координатам, инвалидация работает иначе, чем в классических веб-приложениях.

Основные стратегии:

  • versioned URLs

    • /tiles/v1/ /tiles/v2/
    • самый надёжный способ обновления
  • hash-based paths

    • /tiles/{hash}/{z}/{x}/{y}
  • purge CDN cache

    • используется редко из-за масштаба

Практика показывает, что versioning предпочтительнее purge, поскольку количество тайлов в системе может достигать миллиардов.


Роль OpenLayers в работе с CDN тайлами

OpenLayers не управляет CDN напрямую, но определяет поведение клиента:

  • формирует URL тайлов
  • управляет конкурентными запросами
  • реализует tile grid (ol/tilegrid)
  • кэширует тайлы в памяти браузера
  • контролирует стратегию повторных попыток

Пример настройки tile grid:

import {get as getProjection} from 'ol/proj';
import TileGrid from 'ol/tilegrid/TileGrid';

const tileGrid = new TileGrid({
  origin: [-20037508.34, 20037508.34],
  resolutions: [156543.03, 78271.52, 39135.76],
  tileSize: 256
});

Правильная настройка grid критична: несовпадение с серверной генерацией приводит к «битым» тайлам, которые CDN будет честно кэшировать.


Географическое масштабирование и edge-оптимизация

При глобальной доставке тайлов ключевую роль играет распределение пользователей:

  • локальные карты (городские проекты) выигрывают от регионального CDN
  • глобальные карты требуют multi-CDN стратегии
  • высоконагруженные сервисы используют отдельные edge-кластеры для разных регионов

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

  • кэширование популярных zoom-уровней ближе к edge
  • pre-warming тайлов в регионах с ожидаемым трафиком
  • разделение raster/vector потоков по разным CDN доменам

Форматы URL и совместимость с CDN

CDN эффективно работает только при строгой URL-детерминированности.

Типовые шаблоны:

  • /{z}/{x}/{y}.png
  • /tiles/{z}/{x}/{y}@2x.png
  • /v{version}/{z}/{x}/{y}.pbf

Любые query-параметры снижают cache hit ratio:

  • ?token=abc (может фрагментировать кэш)
  • ?style=dark (создаёт дублирование тайлов)

Поэтому предпочтение отдаётся path-based параметрам, а не query string.


Буферизация и поведение клиента OpenLayers

Браузерный слой в OpenLayers работает совместно с CDN следующим образом:

  • поддерживает пул активных запросов тайлов
  • отменяет невидимые запросы при быстром pan
  • переиспользует загруженные тайлы при повторном входе в viewport
  • хранит LRU-кэш тайлов в памяти

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


Сетевая оптимизация доставки тайлов

CDN эффективность усиливается за счёт:

  • HTTP/2 и HTTP/3 (multiplexing снижает latency)
  • keep-alive соединений
  • предварительной DNS резолюции домена тайлов
  • разделения доменов (tile1.example.com, tile2.example.com) для увеличения параллелизма

Векторные тайлы дополнительно выигрывают от:

  • бинарного формата PBF
  • сжатия на уровне CDN edge
  • агрессивного кеширования геометрии

Совместное использование CDN и динамических слоёв

Не все слои карты могут быть закешированы:

  • статические тайлы — идеально подходят для CDN
  • полудинамические (traffic, weather overlays) — ограниченное кеширование
  • полностью динамические — bypass CDN

В OpenLayers это отражается через разные источники (TileSource, ImageSource, VectorSource), где только часть URL-структур уходит в CDN слой.


Инфраструктурные паттерны масштабирования тайлов

На практике используются следующие схемы:

  • global CDN + regional origins
  • multi-origin replication
  • edge-side includes для метаданных
  • separate CDN for basemap and labels

Разделение слоёв позволяет независимо масштабировать:

  • базовую карту
  • подписи
  • тематические слои

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