Обновлено: 11 апреля 2026 г. в 23:52

Uber/Lyft

средний

Поток координат, подбор водителя, ETA, жизненный цикл поездки и ценовые пики в сервисе заказа поездок.

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

Глава связывает в одну архитектуру поток координат, диспетчеризацию, расчёт ETA, жизненный цикл поездки, динамическую надбавку к цене и расчёты после завершения заказа.

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

Поток координат

Координаты водителей приходят непрерывно, поэтому приём потока, TTL и свежесть геоиндекса нужно проектировать как отдельный критичный контур.

Диспетчеризация

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

ETA и маршрут

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

Пиковый спрос

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

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

Источник

System Design Interview

У Alex Xu есть отдельные приёмы для proximity-сервисов, геоиндексов и потоков координат в мобильных продуктах.

Читать обзор

Масштаб продукта

5M+ поездок в день
100M+ пассажиров
10K+ городов
5M+ водителей

Uber

Uber Engineering Blog

Технические статьи о внутренних сервисах Uber: от геопотоков до расчёта маршрута и цен.

Перейти на сайт

1Функциональные требования

Путь пассажира

  • Указать точку подачи, пункт назначения и тип поездки
  • Увидеть цену и время подачи до подтверждения заказа
  • Получить назначенного водителя и карту его движения
  • Следить за статусом поездки от подачи до завершения
  • Оплатить поездку и оставить отзыв после завершения

Путь водителя

  • Выйти в онлайн или офлайн и публиковать координаты
  • Получать запросы на поездку и принимать или отклонять их
  • Строить маршрут к точке подачи и к пункту назначения
  • Передавать статусы поездки и завершать её в приложении
  • Получать оплату и видеть историю выполненных поездок

2Нефункциональные требования

Низкая задержка

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

Высокая доступность

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

Эластичность

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

Оценка нагрузки

Активных водителей:1M
Обновлений координат в секунду:~300K
Новых запросов в секунду:~1K
Частота обновлений:3-4 сек

3Поток координат в реальном времени

Связанная тема

Геоиндексация

Подходы к пространственному индексу и поиску по карте удобно сравнивать с кейсом Airbnb.

Читать обзор

⚠️ Главная сложность

Миллион водителей, которые отправляют координаты каждые 3-4 секунды, быстро дают сотни тысяч записей в секунду. Для такого потока нельзя опираться только на традиционную транзакционную базу данных.

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

Сервис координат водителей

  • Принимает поток координат от приложений водителей
  • Держит актуальное положение в памяти, например в Redis
  • Помечает водителя как офлайн, если обновления пропали
  • Публикует поток в Kafka для истории, аналитики и зависимых сервисов

Пространственный индекс

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

# Redis GEO commands
GEOADD drivers {lng} {lat} driver_123
GEORADIUS drivers {lng} {lat} 5 km
  WITHDIST WITHCOORD COUNT 10

# Или Geohash подход
SET driver:123:location "9q8yy"
SMEMBERS geohash:9q8yy:drivers

Wikipedia

Geohash

Подход к кодированию координат в строку для пространственного индексирования.

Перейти на сайт

Поток обработки координат

  1. 1Приложение водителя передаёт координаты через WebSocket или UDP
  2. 2Шлюз принимает поток и сглаживает всплески записи батчами
  3. 3Redis Cluster хранит текущие координаты и геоиндекс доступных водителей
  4. 4Kafka получает поток для истории поездок, аналитики и расчёта спроса

4Подбор водителя и пассажира

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

Как проходит назначение поездки

  1. 1
    Пассажир создаёт запрос поездки

    Точка подачи, пункт назначения и тип поездки попадают в шлюз API.

  2. 2
    Сервис диспетчеризации собирает кандидатов

    Из геоиндекса выбираются ближайшие свободные водители с нужным типом автомобиля.

  3. 3
    Кандидаты ранжируются

    Учитываются ожидаемое время подачи, рейтинг, история принятия заказов и текущая траектория движения.

  4. 4
    Лучшему кандидату отправляется оффер

    Push-уведомление или сокетное сообщение живёт ограниченное время, обычно 15-30 секунд.

  5. 5
    При отказе система выбирает следующего

    Так контур назначения остаётся быстрым даже при низкой доле принятых офферов.

Последовательное назначение

Оффер уходит одному лучшему кандидату, и система ждёт ответа перед следующей попыткой.

  • + Проще объяснить и реализовать
  • + Меньше конкуренции между водителями
  • - Медленнее при отказах и молчании

Пакетная рассылка

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

  • + Снижает время до назначения
  • - Повышает конкуренцию между водителями
  • - Сложнее контролировать справедливость выдачи

Перераспределение предложения

Чтобы заранее сглаживать перекос спроса, система показывает водителям зоны высокого спроса и стимулирует смещение туда ещё до нового заказа.

  • Прогноз спроса: модели учитывают время суток, погоду и городские события
  • Текущее предложение: система видит распределение активных водителей по зонам
  • Стимулы: бонусы и повышенные тарифы помогают подтянуть водителей туда, где возник дефицит

5Расчёт времени и маршрута

Оптимизация

Кэширование прогноза времени

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

Читать обзор

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

Какие прогнозы времени считает система

Время до подачи

Время от текущей позиции водителя до точки подачи. Именно его пассажир видит до подтверждения заказа и после назначения водителя.

Время поездки

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

Что влияет на расчёт

Граф дорог
  • Ограничения скорости
  • Односторонние улицы
  • Ограничения поворотов и проезда
Живой трафик
  • GPS-данные активных водителей
  • Пробки и аварии
  • Временные ограничения по маршруту
Исторические данные
  • День недели и время суток
  • Сезонность и повторяющиеся паттерны
  • Систематические ошибки прошлых прогнозов

Маршрутизатор

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

  • Contraction Hierarchies: ускоряют запросы по большому дорожному графу
  • A*: удобен для локального поиска маршрута с учётом текущей обстановки
  • ML-коррекция: правит систематические ошибки прогноза на основе истории

6Динамическая надбавка к цене

Uber Engineering

H3: Hexagonal Hierarchical Index

Open-source библиотека Uber для геопространственного индексирования на гексагональной сетке.

Перейти на сайт

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

Зачем нужна надбавка

Со стороны спроса

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

Со стороны предложения

Более высокая цена привлекает водителей в дефицитные зоны и помогает быстрее восстановить баланс предложения.

Пример расчёта множителя

# Упрощённая формула
surge_multiplier = demand / supply

# Где:
# demand = ride_requests в зоне за последние N минут
# supply = available_drivers в зоне

# Пример зон (Geohash или H3 cells)
zone_9q8yy:
  demand: 50 requests/5min
  supply: 10 drivers
  surge: 5.0x → cap at 3.0x

# Надбавка применяется к базовому тарифу
final_price = base_fare * surge_multiplier

Ценовые зоны

  • Город делят на H3-ячейки или похожие геозоны
  • Для каждой зоны считают собственный множитель надбавки
  • Пересчёт выполняется каждые 1-2 минуты
  • Переходы между соседними зонами сглаживают, чтобы цена не прыгала хаотично

Фиксация цены

  • Пассажир видит цену до подтверждения поездки
  • Цена фиксируется на короткое окно, например на 5-10 минут
  • Система защищает от резкого роста цены уже после согласия пользователя
  • Для аудита и ретраев сохраняется Quote ID

7Жизненный цикл поездки

Жизненный цикл поездки удобнее всего моделировать как : у заказа есть ограниченный набор состояний, а переходы между ними должны быть предсказуемыми и идемпотентными.

Запрос поездки
поиск запущен
Водитель назначен
оффер принят
Водитель едет к подаче
прибытие в пути
Водитель прибыл
ожидание пассажира
Поездка началась
маршрут активен
Поездка завершена
маршрут закрыт
Оплата проведена
чек и выплата
Отменено
Отмена со стороны пассажира или водителя до начала поездки

Текущий этап

1. Запрос поездки

Пассажир указывает точку подачи, пункт назначения и тип поездки. Система сохраняет ценовое предложение и запускает поиск водителя.

  • • Проверка зоны обслуживания и корректности точки подачи
  • • Ограничение частоты запросов и антифрод-проверки
  • • Quote ID и TTL для ценового предложения

Следующий переход

2. Водитель назначен

Если текущий этап завершается успешно, поездка переходит в следующее состояние автомата.

Ветка отмены доступна на этапах запрос поездки, водитель назначен и водитель едет к подаче.

Обновления статуса в пути

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

  • WebSocket: основной канал для живых обновлений карты и статусов
  • Push-уведомления: важные переходы, например назначение водителя или завершение поездки
  • Резервный режим: при проблемах с сокетом клиент использует на периодический опрос

Обработка отмен

  • Отмена до назначения водителя обычно остаётся бесплатной
  • Поздняя отмена пассажиром может приводить к штрафу за подачу
  • Отмена со стороны водителя влияет на его метрики и рейтинг принятия
  • Сценарий no-show требует возврата денег и отдельного аудита событий

8Высокоуровневая архитектура и сценарии

Архитектура и сценарии

Топология обработки запросов в сервисе заказа поездок

Контур запроса и диспетчеризации

Приложение пассажира
запрос поездки
Шлюз API
аутентификация и маршрутизация
Приложение водителя
онлайн-статус
Сервис координат
приём потока координат
Сервис диспетчеризации
назначение водителя
Сервис поездки
автомат состояний поездки

Контур маршрута, цены и расчётов

Маршрут и ETA
маршрут, трафик и прогноз
Сервис цен
стоимость и надбавка
Платёжный сервис
списание и выплаты
Уведомления
push, SMS и чек
Архитектура разводит быстрый контур координат и назначения поездки с более строгим контуром маршрута, цены и расчётов.
Выберите сценарий сверху, чтобы подсветить конкретный путь прохождения запроса через архитектуру Uber/Lyft.

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

Ключевые хранилища

Redis Cluster

Геоиндекс водителей, надбавки по зонам, активные сессии и краткоживущие данные

PostgreSQL

Пользователи, поездки, платежи и другие транзакционные сущности

Cassandra

История координат, события поездок и длинные временные ряды

9Ключевые моменты для интервью

✓ Что стоит обсудить обязательно

  • Как обрабатывать поток из сотен тысяч обновлений координат в секунду
  • Как устроен геоиндекс и поиск ближайших кандидатов
  • Как выбирать между последовательным назначением и пакетной рассылкой офферов
  • Как считать время прибытия с учётом дорожного графа и живого трафика
  • Как динамическая надбавка выравнивает спрос и предложение по зонам

💡 Что можно добавить

  • Совместные поездки и дополнительная оптимизация маршрутов
  • Антифрод: поддельные водители, подмена GPS и аномалии в поездке
  • Функции безопасности: совместный доступ к поездке, SOS и контроль аномальных маршрутов
  • Запланированные поездки и прогноз будущего спроса
  • Мультимодальный транспорт: самокаты, велосипеды, городской транспорт

Типичные ошибки на интервью

  • Пытаться хранить поток координат в обычной SQL-базе без отдельного геоконтра
  • Не проговорить масштаб: сотни тысяч обновлений координат в секунду
  • Игнорировать живой трафик и накопленную ошибку в расчётах времени прибытия
  • Считать динамическую надбавку необязательной «бизнесовой надстройкой», а не частью архитектуры предложения

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

Связанные главы

Чтобы отмечать прохождение, включи трекинг в Настройки