Проектирование Senior Мобильный system design обновлено

Мобильный system design: такси с отслеживанием машины на карте

Вопрос

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

Коротко

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

Что должно быть в решении

  1. 1
    Требования: состояния заказа, частота обновления позиции, точность, офлайн и плохая сеть, батарея
  2. 2
    Состояния: машина состояний заказа на клиенте и сервере, восстановление после перезапуска
  3. 3
    Реалтайм: WebSocket или SSE на экране поездки, push для смены статуса в фоне
  4. 4
    Карта: интерполяция и анимация маркера, сглаживание шумных координат, кеш тайлов
  5. 5
    Оплата: идемпотентные операции, статус «проверяем», чек
  6. 6
    Узкие места: батарея (GPS, сеть), потеря связи, гонки статусов

Что спросит интервьюер

  • Что увидит пассажир, если связь пропала на минуту?
  • Как избежать прыжков машины по карте?

Разбор

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

Реалтайм: пока экран открыт, постоянное соединение передаёт позицию машины раз в несколько секунд и события статуса; в фоне смена статусов приходит push. При обрыве клиент показывает последнюю позицию с индикатором «обновляем», переподключается с backoff и запрашивает текущее состояние целиком.

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

Оплата: привязанная карта на стороне провайдера, списание делает сервер по завершении; если ответ не пришёл, клиент проверяет статус, а не повторяет оплату. История поездок пагинируется и кешируется.

Батарея: геолокация пассажира не нужна постоянно, соединение закрывается в фоне.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.