Разделите заказы, геопозицию и подбор водителей. Приём заказа должен атомарно закреплять одного водителя; координаты и поиск масштабируются отдельно от транзакций поездок.
Конструирование масштабируемого сервиса такси
Разделите заказы, геопозицию и подбор водителей. Приём заказа должен атомарно закреплять одного водителя; координаты и поиск масштабируются отдельно от транзакций поездок.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Разработайте архитектуру сервиса, схожего по функционалу с Yandex Taxi или Uber, рассчитанную на 100 млн пользователей и 1 млн поездок ежемесячно, при условии, что каждый водитель совершает в среднем 30 поездок в день. Пользователь должен иметь возможность: оформить заказ такси, просмотреть список доступных автомобилей, отменить уже сделанный запрос. Водитель, в свою очередь, должен уметь: принять поступивший заказ, отменить его, а также находить подходящие заказы.
Ответ
Разделите заказы, геопозицию и подбор водителей. Приём заказа должен атомарно закреплять одного водителя; координаты и поиск масштабируются отдельно от транзакций поездок.
За миллион поездок в 30 дней получается около 0,39 заказа в секунду в среднем. Это не пиковая нагрузка, а 100 млн зарегистрированных пользователей не равны одновременным клиентам. При 30 поездках на водителя в день арифметический минимум — около 1112 ежедневно работающих водителей, без учёта географии и простоев.
Координаты храните в быстро обновляемом геоиндексе с TTL. Подбор ищет кандидатов поблизости и отправляет предложения с ограниченным сроком. Принятие выполняется условным переходом состояния заказа и проверкой занятости водителя. Отмена также зависит от текущего состояния. Для событий, уведомлений и повторов нужны идемпотентность, журнал переходов и восстановление после сбоев. Сначала уточните города, пики и частоту обновления координат.