Истекший ключ хуже пустого
Карты в CRM на платном сервисе, запасной вариант на OpenStreetMap и почему он не сработал. Плюс честный расчет «платить или свои тайлы».
В 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 тыс. ₽ за свой сервер.
Правило получилось простое:
- Около миллиона запросов в год - остаемся на платном сервисе: разница в деньгах небольшая, а карта заметно подробнее.
- Два-три миллиона и больше - свои тайлы впятеро дешевле.
Главное - сначала посмотреть фактический расход в кабинете сервиса, а не считать на глаз. Прогноз на калькуляторе и реальная нагрузка от диспетчеров, которые держат карту открытой весь день, могут отличаться в разы.