Какие вопросы задавать при проектировании архитектуры приложения доставки еды
Что проверяют
Это задача на системный дизайн, и первые минуты проверяют, умеете ли вы превратить расплывчатое «сделайте доставку» в список требований и цифр. Интервьюер ждёт вопросов, а не схемы с микросервисами на первой минуте. Следом обычно просят оценить нагрузку и описать жизненный цикл заказа.
Как отвечать
Задавайте вопросы группами и фиксируйте ответы:
- участники и сценарии: клиент, ресторан, курьер, поддержка. Что входит в первую версию: каталог и корзина, оплата, назначение курьера, отслеживание на карте;
- масштаб: сколько заказов в сутки, один город или сотня. 100 тысяч заказов в сутки это в среднем чуть больше одного в секунду, но в обед и вечером нагрузка в разы выше, и считать систему нужно под пик;
- геоданные: как часто курьер шлёт координаты. 10 тысяч курьеров раз в 5 секунд дают около 2 тысяч записей в секунду, такой поток держат в Redis с геоиндексом, а не в основной базе;
- согласованность: статусы заказа это конечный автомат, что делать при сбое посреди перехода;
- оплата: списание сразу или холдирование до подтверждения рестораном, что происходит при отмене;
- интеграции: как ресторан получает заказ и стоп-лист, откуда карты и расчёт времени доставки;
- нефункциональные требования: допустимая задержка, доступность, где хранятся персональные данные.
Потом привяжите ответы к стеку: сервисы на Spring Boot, заказы в PostgreSQL, события между сервисами через Kafka с паттерном transactional outbox, чтобы запись в базу и отправка события не расходились. Цепочку «заказ, оплата, ресторан, курьер» ведите как сагу с компенсирующими шагами, а положение курьера клиенту отдавайте через WebSocket или SSE.
Где спотыкаются
Сразу рисуют микросервисы и Kubernetes, не спросив про масштаб. Для одного города может хватить модульного монолита.
Считают среднюю нагрузку вместо пиковой, хотя падает система именно в пик.
Забывают про повторы. Мобильный клиент на плохой сети отправит запрос дважды, и без ключа идемпотентности появится второй заказ и второе списание.