Истекший ключ хуже пустого

Карты в CRM на платном сервисе, запасной вариант на OpenStreetMap и почему он не сработал. Плюс честный расчет «платить или свои тайлы».

2 мин чтениякартыLeafletинфраструктура

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

Проверка выглядела так:

const url = MAP_KEY ? PAID_TILES_URL : OSM_TILES_URL;

И вот ловушка. Пробный ключ живет месяц. Когда он истекает, переменная окружения не становится пустой - ключ по-прежнему есть, просто сервис на него отвечает отказом. Условие MAP_KEY ? видит строку, выбирает платные тайлы, а они не грузятся. Карта не откатывается на OpenStreetMap, она становится серой.

Запасной вариант, который срабатывает только на пустом ключе, защищает от случая, которого почти не бывает. Ключ, который был и умер, - обычная история.

Как сделать откат по факту, а не по настройке

Смотреть надо на то, грузятся ли тайлы, а не на то, задан ли ключ. В Leaflet это событие tileerror:

const primary = L.tileLayer(PAID_TILES_URL, { maxZoom: 18 });
const fallback = L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
  maxZoom: 19,
  attribution: '© OpenStreetMap',
});

let errors = 0;
primary.on('tileload', () => (errors = 0));
primary.on('tileerror', () => {
  // Пара ошибок бывает и на плохой сети, десять подряд - подложка мертва.
  if (++errors === 10) {
    map.removeLayer(primary);
    fallback.addTo(map);
  }
});
primary.addTo(map);

Нужен и сторож на стороне сервера: раз в сутки он запрашивает один тайл с боевым ключом и поднимает тревогу на отказ. Пользователь не должен узнавать о кончившемся ключе первым. Это тот же принцип, что в фишке «Сторож смотрит на результат, а не на запуск».

Платить или свои тайлы

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

Цифры на момент выбора:

Вариант Цена
100 тыс. запросов тайлов в платном сервисе 8 000 ₽
1 млн запросов 56 000 ₽
5 млн запросов 200 000 ₽
Годовая оплата минус 10%
Свой сервер тайлов из OpenStreetMap 1 500 - 2 500 ₽ в месяц, 18 - 30 тыс. ₽ в год, настройка примерно день

Прогноз расхода - около миллиона запросов в год: карта открывается «под точки», а не листается часами, обычный зум - 16. Это 50 - 56 тыс. ₽ в год за платный сервис против 18 - 30 тыс. ₽ за свой сервер.

Правило получилось простое:

  • Около миллиона запросов в год - остаемся на платном сервисе: разница в деньгах небольшая, а карта заметно подробнее.
  • Два-три миллиона и больше - свои тайлы впятеро дешевле.

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

Esc

↑↓ выбор Enter открыть