Иногда продуктовая фича живёт в приложении «для галочки». Пользователи вроде бы ею пользуются, команда её не развивает, а аналитики не могут толком оценить влияние на метрики. Так было с нашим старым механизмом поиска ближайших машин в каршеринге — «Радаром». Он просто пинговал координаты и сообщал, когда рядом появлялась машина. Никакой логики приоритизации, никаких фильтров, никакого резерва — сырая идея без развития.

В статье рассказываем, как мы заново осмыслили и пересобрали фичу:
— продакт Настя Голованова — о том, как мы нашли value, перезапустили механику и успели в сроки размещения наружной рекламы;
— разработчик Михаил Ефанов — про то, как превратить монолит в стабильную архитектуру.

Полезно будет всем, кто работает на стыке развитии продукта и инженерии: от старта фичи до релиза и плана развития.

Почему «Радар» нельзя было просто выключить 

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

А ещё у нас копился внутренний запрос. Сотрудники, которые сами ездят на Ситидрайве, рассказывали:

«У офиса вечером машина очень быстро разбирают. Обновлять карту — утомительно. Нам бы радар поднять».

Кроме того, из-за сбоев в определении геопозиции искать машину вручную стало сложнее. Особенно в зонах с нестабильной связью: каждый раз открываешь карту — и снова надо искать свой дом или офис. С «Радаром» — поставил точку один раз, и сервис сам сообщит, когда рядом появится машина.

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

Как появилась идея переосмыслить старый «Радар»?

Из общения с пользователями стало ясно: бывают ситуации, когда человек готов уехать и даже подождать, но рядом просто нет доступных машин. Даже если аренда рядом вот-вот завершится, пользователь об этом не узнает — мы потеряли поездку, а каршеровод расстроился. 

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

Проблема №2: Гонка за бронированием в зонах высокого спроса. Особенно больно это ощущается в аэропортах. Пока один пользователь изучает карточку машины, другой уже её забронировал.
Идея: Добавить опцию резервирования автомобиля за пользователем сразу после того, как машина нашлась.

Проблема №3: Машина есть, но она не подходит. Бывает и так: машина рядом, но пользователь не едет. Причина — машина не та: кому-то нужен бустер, кому-то — только авто бизнес-класса.
Идея: Добавить фильтры по параметрам машины — от класса авто до опций вроде детского кресла, чтобы пользователь мог найти именно то, что ему нужно. 

После формирования идей наступил этап оценки. Нам было важно посчитать, какой объём пользователей мы привлечём. Главная задача — оценить, сколько новых поездок мы реально сможем получить, исключая тех, кто и так готов бронировать авто и ехать.

Как это было посчитано:

  1. Смотрим аналитику за последние 2 недели — отобрали все случаи, когда пользователь включил «Радар» (старую версию функции), но поездка так и не состоялась в течение ближайших 3 часов.

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

  3. Если такая машина появлялась, мы считали, что пользователь с 50% вероятностью совершил бы поездку, когда увидел бы машину и смог её забронировать.

За 2 недели было 33 тысячи случаев, когда после включения радара поездки не было. На основе этого мы сделали пессимистичную оценку экономического эффекта: улучшение логики радара могло бы дать значительный прирост GMV — только за счёт того, что мы «подсвечиваем» уже доступные машины тем, кто действительно готов ехать.

Итерации и гипотезы: как мы шаг за шагом создавали «Радар», который действительно работает

В процессе подготовки «Радара» мы тщательно изучили рынок, посмотрели какие решения уже существуют у других игроков. Анализ отзывов, в том числе в социальных сетях, помог выявить ключевые пожелания — например, необходимость строить маршрут не по прямой линии, а с учётом реальных пеших путей, обходящих реки и ж/д пути.

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

Так появились четыре этапа развития «Радара»:

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

Второй этап — внедрение автобронирования. Теперь при включённой опции найденный автомобиль сразу резервируется — гарантируя, что вы не упустите шанс. 

Третий этап — фильтры. Пользователи получили возможность выбирать класс авто, модели, а также дополнительные опции — детские кресла, бустеры, транспондеры. 

Четвёртый этап — «период бронирования». Можно задать время старта и интервал поиска — «Радар» будет работать автономно. 

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

Переход от монолита к микросервисам — архитектура и практические решения

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

Старая версия «Радара» осталась в монолите, поэтому наша стратегическая задача — перенести фичу на микросервисную архитектуру. Первым делом нужно было понять, какую нагрузку будет испытывать новый микросервис. Для этого мы проанализировали поведение старого проекта. В архитектуре монолита данные о текущих и завершённых «Радарах» хранились в PostgreSQL. Используя SQL-запросы и сопоставляя их с метриками шлюза (gateway), мы определили, что средняя нагрузка — около 0.5 запросов в секунду.

Понимая, что новая фича будет активно использоваться — мы заложили нагрузку в 2 RPS. Эта цифра стала отправной точкой для дальнейшего проектирования.

Проектирование API и ключевой функционал

Базовый набор функций, которые должен поддерживать API:

  • Создание радара;

  • Удаление радара;

  • Получение статуса радара;

  • Построение изохрон — зоны, достижимой за заданное время, для поиска доступных автомобилей.

Все эти операции уложились в привычный CRUD-подход. Интересный момент — построение изохроны мы решили не реализовывать самостоятельно, а подключиться к API 2GIS. Это позволило значительно снизить сложность и затраты. По нашим прогнозам, при полном использовании функционала пришлось бы делать около 16 миллионов запросов в месяц. Чтобы не перегружать систему и не увеличивать расходы, мы тщательно продумали стратегию кэширования ответов — да, кэширование не устарело и здесь оказалось жизненно важным.

Первая итерация: каналы и горутины 

Первая идея реализации была вдохновлена возможностями Go: использовать каналы и горутины. Логика выглядела так — при создании радара открывается канал, в котором горутина выполняет поиск машин, а по результату отправляет уведомления. Казалось, что этот вариант идеально подходит для асинхронной обработки и параллельного поиска. Но на практике мы столкнулись с рядом сложностей:

  • Проблема масштабирования. При масштабировании сервиса на несколько подов запрос на получение статуса радара должен попадать в тот же под, где был создан канал. Это потребовало бы внедрения sticky sessions, что усложняло реализацию и требовало опыта, которого у команды на тот момент не было.

  • Перезапуск сервиса. При перезапуске сервиса состояние каналов теряется, и восстановление всех активных радаров стало бы нетривиальной задачей.

В итоге от этой идеи отказались, слишком сложно и ненадёжно в контексте нашего проекта.

Вторая итерация: Redis, Kafka и short polling

Следующая версия архитектуры выглядела так:

  1. Хранение данных. Состояние радаров (создание, удаление, статус) сохраняется в Redis. Это позволило быстро обрабатывать CRUD-операции.

  2. Генерация задач. Отдельный сервис (генератор задач) забирает все активные радары из Redis и формирует задачи, которые отправляются в Kafka.

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

Флоу простыми словами: 

API создаёт радар в Redis -> Генератор раз в N времени достаёт все активные радары и формирует на основе его данных задачи -> Перекидывает задачи в Kafka -> Под с основной логикой читает топик с задачами -> Проверяет освободившиеся машины в рамках изохроны -> Отправляет уведомление.

Для получения статуса радара мы выбрали механизм Short polling, а не Long polling и WebSocket по следующим причинам:

  • Простота реализации. Short polling не требует сложной инфраструктуры для поддержания постоянных соединений, как в случае с WebSocket, и минимизирует изменения на стороне сервера по сравнению с Long polling.

  • Предсказуемая нагрузка. Short polling позволяет клиентам периодически запрашивать статус, что легче прогнозировать и масштабировать, чем управление длительными соединениями в Long polling или WebSocket.

  • Совместимость с существующей инфраструктурой. Short polling не требует дополнительных настроек прокси или балансировщиков нагрузки, что упрощает развёртывание и снижает затраты на поддержку.

Хотя Short polling увеличивает количество запросов от клиента, он оказался наиболее подходящим компромиссом для нашего случая, учитывая ограничения по ресурсам и времени на разработку.

Проблемы масштабирования 

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

В качестве решения мы планируем разработать новый сервис, который назвали Taskkuler. Его задача — генерация уникальных задач, на основе ClickHouse (если интересно — подготовим об этом статью ?).

Это позволит централизовать процесс генерации задач и устранить дублирование, обеспечив масштабируемость системы. Сейчас Taskkuler находится на стадии планирования, и мы продолжаем прорабатывать детали его интеграции.

Ещё одной сложностью стала коммуникация через push-уведомления. APNS (Apple Push Notification Service) не гарантирует доставку и скорость уведомлений, что создавало риски для своевременного информирования пользователей. Чтобы минимизировать эту проблему, мы решили также использовать Short polling для передачи статуса поиска радара. Это позволило сделать систему более надёжной, хотя и увеличило нагрузку на клиентскую часть.

Каждый уважающий себя продакт доводит фичу до релиза

Есть расхожее мнение, что продакт — это человек с идеей, который «передаёт всё в разработку» и уходит думать дальше. В реальности — совсем не так. По крайней мере, у нас — в Ситидрайве продакт сопровождает фичу на всех этапах: от первой гипотезы до ретроспективы после релиза. А потом ещё следит, как она живёт в «реальном мире». Ну и делает фото билборда с релизом, чтобы мама гордилась ?.

Висим на каждом столбе

Первые релизы не «рвали чарты» по вовлечённости. Проблема была простая: пользователи просто не знали, что у нас что-то изменилось. К счастью, в Ситидрайве есть мощный тандем продукта и маркетинга. И это тот случай, когда всё сошлось: мы запустили удобную фичу, а маркетинг подхватил её на всех возможных поверхностях — от соцсетей до билбордов. Было приятно ловить наш релиз буквально по пути домой из офиса и одновременно наблюдать, как растут метрики использования.

Маркетинг не только круто подсветил проект, но и подбросил немного адреналина. У наружной рекламы есть точная дата выхода, и просто не существовало варианта не успеть с релизом к дедлайну. Конечно, был план Б, но к счастью, он не понадобился.

Как «Радар» влияет на бизнес-показатели

Запуск «Радара» — это не просто релиз удобной фичи, а сильный шаг в сторону продуктовой зрелости. За привычным интерфейсом — серьёзная бизнес-машина, которая уже через месяц показала результат. Поездки с использованием «Радара» принесли выручки в 3 раза больше, чем те, где им не пользовались.

Уроки проекта и выводы

Сейчас «Радар» поддерживает автобронирование и фильтрацию по ключевым параметрам автомобиля — от класса до дополнительных опций. Мы продолжаем развивать инструмент: у нас есть несколько гипотез по его дальнейшему улучшению, которые сейчас изучаем и тестируем.
Проект стал ценным опытом в решении классических задач микросервисной архитектуры: масштабировании, обеспечении надёжности уведомлений и выборе оптимальных технологий. В планах — запуск нового сервиса генерации задач, который обещает повысить эффективность системы, хотя и потребует внимательной интеграции.
Не претендуя на идеальное решение, команда открыта для обмена опытом и готова к обратной связи от сообщества ?

Комментарии (14)


  1. yaroslavp
    18.07.2025 13:18

    Может не юзлес радар будете апдейтить, а реально нужные вещи, типо загрузки и определения местоположения не за 30 секунд, а почти мгновенно? Почему-то яндекс смог, как в навигаторе, так и в драйве. Вот это единственное, что прям раздражает


    1. asgolovanova Автор
      18.07.2025 13:18

      ой, ну не просто так у вас карма отрицательная!!
      1. на чем основано утверждение, что фича юзлесс?) прочитайте хотя бы заголовок статьи
      2. про единственный раздражительный кейс, что вы описываете - мало инфы, расскройте детали


      1. GidraVydra
        18.07.2025 13:18

        На пользовательском опыте за овер 5000 км в вашем сервисе. Подтверждаю, радар бесполезен на 101%.

        Кстати, а нафига вы убрали зону перед Матмехом СПбГУ? Нормально же всë было.


      1. yaroslavp
        18.07.2025 13:18

        Карма отрицательная потому что наваливаю базы, которая иногда идёт вразрез с принятым мнением, вот челы минусят.

        У меня тоже, как у нижнего (теперь уже верхнего) комментатора, почти последний статус в Ситидрайве, то есть накат довольно большой, и ни разу не использовал этот бесполезный радар.

        Инфы достаточно: включаю вай-фай/мобильный интернет + определение местоположения -> захожу в приложение, мне показывает последнюю сохранённую локацию -> после длительного ожидания (30 сек +-, иногда больше) приложение соизволило показать мое текущее местоположение. В яндекс навигаторе или драйве все те же самые действия, но мгновенно. И разумеется я НЕ сначала запускаю Ситидрайв, потом навигатор. Все тесты были при холодном старте приложений для частоты эксперимента

        И вот ещё накину:

        1) Отображение машин с названиями моделей и ценой. Сейчас же нужно прокликивать каждую точку.

        2) Отображение фотографий последнего завершившего аренду («Найти по фото»). С глушилками GPS в Москве стало очень затруднительно пользоваться сервисом: приходишь к машине, а её нет. В приложениях конкурентов можно сразу найти, там машина или нет.

        3) Возможность по завершении аренды указать, куда приехал вместо звонка в техподдержку.

        И цена чето сравнялась с остальными, а машины как были самыми старыми среди остальных, так и остались. Куда-то политика компании идёт не туда. Юзлес фичи, вместо реально нужных вещей, токсичные девочки на писаках статей, обдирание пользователей


        1. asgolovanova Автор
          18.07.2025 13:18

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

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

          Статья про радар - это конкретный кейс про то, как мы выявили проблему пользователей и решали ее. Комментарии и идеи по другим улучшениям функциональности нашего продукта - это супер, но они не имеют никакого отношения к статье. Доказывать, что радар - это хорошее и полезное решение, тоже не вижу смысла, так как показатели фичи говорят об обратном. У вас, наверное, просто не было ситуации, когда радар мог бы пригодиться. Можете, кстати, после прочтения воспользоваться им, если не будет машин поблизости, вам понравится!

          Вы подали мне идею для следующей статьи. Расскажу, как мы подходим к выбору фичи для реализации и что такое продуктовая стратегия, почему нельзя взять и реализовать все идеи пользователей и решения, которые уже есть у конкурентов сразу (спойлер: не все решения конкурентов нужно копировать).


          1. yaroslavp
            18.07.2025 13:18

            Странные конечно пользователи: ну если нет машин, можно просто использовать другое приложение, благо в Москве их как минимум 5 штук, и они не отличаются в контексте кейса "мне просто нужно доехать из точки А в точку Б". Что, прям ни одной машины ни одного сервиса нет в конкретной точке? Или лояльность пользователей настолько высока, что они прям ждут, а не выбирают иной сервис (какие же тогда киллер фичи, что я их до сих пор не приметил?)?


            1. asgolovanova Автор
              18.07.2025 13:18

              да, лояльность таких пользователей выше


  1. CTRL-SHOP
    18.07.2025 13:18

    )


  1. SukharevAndrey
    18.07.2025 13:18

    Вместо того, чтобы делать реально полезные фишки, занимаются какой-то ерундой.

    Самое банальное, что приходит в голову:

    1) Отображение машин с названиями моделей и ценой. Сейчас же нужно прокликивать каждую точку.

    2) Отображение фотографий последнего завершившего аренду («Найти по фото»). С глушилками GPS в Москве стало очень затруднительно пользоваться сервисом: приходишь к машине, а её нет. В приложениях конкурентов можно сразу найти, там машина или нет.

    3) Возможность по завершении аренды указать, куда приехал вместо звонка в техподдержку.

    4) Ужасные стыки в зонах завершения, где нельзя парковаться. Я, конечно, понимаю, что сейчас технически внутренняя софтина позволяет рисовать только выпуклые многоугольники, но блин, у других этого нет.

    5) Тарифы километры + минуты, как у всех. Сейчас же километры всегда в пакетных тарифах тарифицируются за каждый километр.

    И многое другое. Но это не меняется годами, вместо этого лепят webview на смежные сервисы компании.

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

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


    1. asgolovanova Автор
      18.07.2025 13:18

      Привет! Спасибо за идеи, эти и многие другие в работе у команды продукта. Каждую инициативу мы реализуем последовательно в соответствии со стратегией бизнеса.

      Статья была написана про решение конкретного пользовательского кейса, не углублялись в то, с какими фичами конкурировал "радар".


      1. imemeritus
        18.07.2025 13:18

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

        Ну и поездки по фиксу у вас "классные", конечно - если не уложился в тайминг, получай полный поминутный перерасчет. Тоже мотивирует (поискать Дели или ЯД).


  1. Barlogishe
    18.07.2025 13:18

    Насколько я понимаю внедрили функцию, которая работает давно у других провайдеров и возвели это в виду? Я не увидел ничего нового в вашем решении.

    И та агрессия, с которой вы откликнулись на первый комментарий вас не красит. Да, пользователь посчитал ваше решение бесполезным. И вы, не доказав обратного, не нашли ничего лучше, чем "ткнуть" Носом в его карму.


    1. asgolovanova Автор
      18.07.2025 13:18

      Да, подобное решение есть и у конкурентов, но оно не идентично. Мы добавили изохрону, которая расчитывает реальное время пользователя в пути от выбранной точки.
      Ну и плюсом ко всему, эта статья - в первую очередь пример, как подходить к решению бизнес-проблемы.

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


  1. ceewok
    18.07.2025 13:18

    Странно, что никто не написал про подтверждение открытых дверей авто. И ведь реально не всегда открываются двери.

    Радар я вам дам. Двери открыть с первого раза я вам не дам.