Платформа для совместных поездок в масштабах Uber требует архитектуры микросервисов, развёрнутой в нескольких регионах, где каждый сервис может масштабироваться независимо и обладает отказоустойчивостью.
Водители отправляют GPS-координаты каждые 3–5 секунд через WebSocket-соединения. Обновления местоположения проходят через высокопроизводительный брокер сообщений вроде Apache Kafka, а затем в выделенный Location Service, который записывает данные в хранилище в памяти наподобие Redis.
Чтобы эффективно найти близлежащих водителей, карта разбивается с помощью geohash или S2 cells. Позиция каждого водителя соответствует ячейке geohash, что позволяет быстро выполнять запросы близости. Redis нативно поддерживает GEOSEARCH для этого.
Когда пассажир запрашивает поездку, Matching Service ищет доступных водителей поблизости в определённом радиусе, ранжирует их по ETA и рейтингу, а затем отправляет push-уведомления. Принятие водителем запроса инициирует создание поездки, которая хранится в базе данных PostgreSQL с гарантиями строгой консистентности.
Surge Pricing Service постоянно отслеживает:
Цены автоматически корректируются, когда спрос существенно превышает предложение.
ETA вычисляется с использованием графовой маршрутизации на основе данных о дорожном трафике в реальном времени. Сервисы вроде Google Maps API или собственный движок маршрутизации (например, OSRM) рассчитывают кратчайшие пути с учётом текущих условий.
Платежи обрабатываются через идемпотентный Payment Service, интегрированный с провайдерами вроде Stripe. Каждая транзакция логируется для аудита, а логика повторных попыток предотвращает двойные списания.
После завершения поездки как пассажир, так и водитель оставляют оценки. Они обрабатываются асинхронно и усредняются в профилях, влияя на приоритет при будущем сопоставлении.
Redis для кэширования горячих данныхKafka для слабосвязанного асинхронного взаимодействияGeohashing разбивает карту на ячейки фиксированного размера, что позволяет выполнять proximity queries за константное время для поиска близлежащих водителей без необходимости в дополнительных структурах индексирования.
Новый — ещё не проверен сообществом
Вы