Как сделать три платных сервиса ETA одним бесплатным

Akkozov Meder
Mad Devs — блог об IT
4 min readJul 2, 2020

Эта статья рассказывает об опыте, подключения 3-х сервисов для бесплатного использования ETA (estimated time of arrival). Все основано на моем личном опыте работы в качестве бэк-энд-разработчика в проекте GoDee. GoDee — это стартап, предлагающий бронирование мест в автобусе онлайн. Более подробную информацию об этом проекте можно найти здесь:

Предыстория

Наша команда занимается проектом под названием GoDee, который связан с общественным транспортом и у нас возникла проблема с автомобильными пробками. Пользователям надоело ждать или гадать через сколько минут приедет автобус, и было решено написать сервис, который рассчитывает примерное время прибытия (ETA) автобуса.

Конечно, если бы команда начала делать ETA с нуля, то поставили бы бизнесу эту задачу в лучшем случае через год. Поэтому, чтобы сделать её быстрее мы начали поиск и нашли инструмент Google Distance Matrix API. Позже написали свой сервис назвав его “Pifia” (передаем привет фанатам фильма Матрица).

Проблемы

Со временем бизнес рос и база пользователей увеличивалась. Мы столкнулись с проблемой увеличения запросов в Google Distance Matrix API. Почему это проблема? - Потому что каждый запрос стоит денег. Google API дает 10.000 бесплатных запросов в месяц, после за каждую 1.000 запросов надо платить 20$. У нас было тогда примерно 150.000 запрос в месяц и вы можете представить сколько денег уходило на сервис. Финансовый отдел компании был, мягко говоря, в шоке ).

Мой ментор даже хотел продать меня в начале на органы, а потом в рабство, чтобы отдать долг, но позже он передумал (но это просто шутка). Он дал мне задачу сделать кэш для хранения ETA на 30 минут, чтобы не отправлять запросы в Google API каждые 3 секунды (наше приложение каждые 3 секунды отправляет запросы для получения свежих данных). Кэш был сделан, поскольку машины стоят в пробках, а дистанция меняется в лучшем случае только раз в десять минут. Был еще один нюанс, например, 5 пользователей просят информацию об одном и том же автобусе, а это один и тот же запрос. Кэш решал, как раз-таки такие проблемы.

Код кэша

Альтернативные сервисы

Кэш работал, но не долго, возникла та же проблема - количество запросов снова выросло. Было принято решение заменить Google API на OSRM. Давайте в начале узнаем, что такое OSRM.

Open Source Routing Machine или OSRM — это реализация C ++ высокопроизводительного механизма маршрутизации для кратчайших путей в дорожных сетях.

Wikipedia

Если коротко, то это сервис для построения маршрута с учетом ETA (это грубое, но короткое описание, если нужны подробности, то вот ссылка). У OSRM есть одна проблема, она строит маршруты и просчитывает ETA без учета пробок. Чтобы решить эту проблему я начал искать сервисы, которые могут предоставлять информацию о трафике в нужной части мне города. HERE Traffic как раз предоставлял нужные мне данные. После небольшого изучения документации, я написал небольшой код, который получает информацию о трафике каждые 30 минут. А для загрузки информации о трафике в OSRM написал небольшой скрипт с командой ./osrm-contract data.osrm --segment-speed-file updates.csv (подробности по ссылке).

Теперь математика: каждые полчаса идет запрос на HERE чтобы получить информацию о трафике это 2 запроса в час, то есть в день это 48 запросов (24 * 2 = 48), а в месяц примерно ≈ 1.488 (48*31 = 1.488) в год 17.520. Да нам этих бесплатных запрос от HERE на 15 лет хватило бы.

Код на получения трафика

Предварительные тесты показали, что сервис работает отлично, но есть проблема, HERE отдает информацию о трафике на “тарабарском языке” и данные не соответствуют формату OSRM. Чтобы информация подходила нужно воспользоваться еще одним сервисом HERE для геокодирования + osm (для получения точек на карте). Я подсчитал, что это примерно 450.000 запросов в месяц. Позже от OSRM пришлось отказаться, поскольку количество запросов превышало бесплатный лимит. Мы не сдались и подключили HERE Distance Matrix API и убрали на время Google Distance Matrix API. Логика HERE простая — посылаем координаты из точки А в точку B, получаем время прибытия автобуса.

После того как мы всё установили на тестовый сервер и начали проверять, пришли первые отзывы от тестировщиков. Сказали, что ETA считывает время неправильно. Начали искать проблему, смотрели логи (для логов использовали Data dog), логи и тесты показали, что все работает отлично. Решили расспросить насчет проблемы чуть подробнее, оказалось, если машина стоит в пробке 15 минут, ETA показывает одно и тоже время. Решили, что это из-за кэша поскольку она хранит изначальное время и не обновляет его 30 минут. Начали искать проблему, в начале проверили данные на веб версии HERE Distance Matrix API (которая называется wego here), все работало нормально, мы получали одно и тоже ETA. Также эту проблему проверили и на сервисе Google map. Проблемы не оказалось. Сервисы сами показывают такое ETA. Объяснили все тестировщикам и бизнесу, они все приняли.

Наш team lead предложил подключить еще один ETA сервис и вернуть Google API как запасной вариант и написать код с логикой переключения сервисов (переключатель нужен был, если запросы пройдут бесплатное количество запросов). Код работает примерно так:

val = getCount() // получаем количество использованых запросовif getMax() <= val { // проверяем на лимит бесплатных запросов используемого сервиса  newService = switchService(s) // если лимит исчерпан переключаем сервис  return newService(from, to) // отдаем логику нового сервиса}

Нашли следующий сервис Mapbox, подключили, установили и он работал, в результате наш eta имел:

“Here” — 250.000 бесплатных запросов в месяц“Google” — 10.000 бесплатных запрос в месяц“Mapbox” — 100.000 бесплатных запрос в месяц

Заключение

Всегда ищите альтернативы, иногда бывает, что фича нужная, но бизнес на текущем этапе развития не готов тратить много денег. Как разработчик который много работал над сервисом, вы должны довести задачу до реального использования. Эта статья рассказывает, как мы вертелись чтобы подключить еще сервисы для бесплатного использования ETA, чтобы улучшить пользователький опыт и не потратить на это все имеющиеся деньги.

--

--