Такие разборы задач отлично помогают потренироваться в подходах к решению рабочих задач + увеличить насмотренность.
Задача
Сценарий:
У нас есть e-commerce платформа, состоящая из:
-
веб-приложения,
-
брокера сообщений,
-
бэкенда.
Клиенты могут заказывать товары, а складская система проверяет наличие товаров на складе.
Каждый раз, когда клиент делает заказ, система отправляет запрос через брокер для проверки доступности товара на складе и блокирует его на время обработки заказа.
Проблема:
Клиенты могут:
-
добавлять несколько товаров в корзину одновременно,
-
отправлять несколько заказов.
Это приводит к тому, что резервируется больше товара, чем есть на складе.
Из-за этого возможны ситуации, когда товар отображается как доступный, но при попытке завершить заказ оказывается, что он уже заблокирован другим клиентом.
Необходимо:
-
Выявить процессы, которые происходят,
-
На основе этих процессов отобразить схему (sequence diagram) взаимодействия,
-
Предложить 2 способа оптимизации, чтобы избавиться от текущих проблем.
Решение
Выделим процессы, которые есть из описания задачи и разделим их на:
-
бизнес-процессы,
-
системные взаимодействия.
Начнём с бизнес-процессов
1. Добавление товара в корзину
-
проверка наличия товара на складе.
2. Оформление заказа
-
отправка полного списка товаров, которые выбрал клиент,
-
резервирование товаров для дальнейшего списания после оплаты.
Выделять больше процессов не вижу смысла — пока достаточно.
Теперь «как это выглядит под капотом»
Выделим компоненты системы:
-
Веб-приложение,
-
Бэкенд,
-
Брокер сообщений,
-
Сервис склада.
Добавление товара:
-
Клиент добавляет товар в корзину,
-
Веб-приложение отправляет запрос на добавление товара в корзину на бэкенд,
-
Бэкенд отправляет запрос на проверку наличия товара на складе через брокер,
-
Сервис склада вычитывает сообщение и сообщает, есть товар или нет,
-
Бэкенд возвращает ответ веб-приложению — можно добавить товар или нет.
Оформление заказа:
-
У клиента собрана корзина,
-
Он нажимает «Оформить»,
-
Веб-приложение отправляет запрос на бэкенд со списком товаров и количеством,
-
Бэкенд отправляет сообщение на резервирование товара через брокер,
-
Сервис склада вычитывает сообщение и резервирует товар или отклоняет запрос,
-
Бэкенд возвращает результат в веб-приложение,
-
При успешном резервировании — переходим к оплате, при неуспехе — отклоняем заказ.
Получилась ситуация AS IS
Теперь на основе этой диаграммы можем предложить изменения, которые помогут решить исходную проблему.
Напомню условия задачи:
> Клиенты могут добавлять несколько товаров в корзину одновременно и отправлять несколько заказов → резервируется больше товара, чем есть на складе → товар отображается как доступный, но при оформлении оказывается уже зарезервирован.
Первая неэффективность
Несколько клиентов добавили товар в корзину, но никто не зарезервировал его за собой.
Пример:
-
У нас 1 кг бананов на складе,
-
Три клиента добавили этот килограмм в корзину,
-
Для каждого товар отображается как доступный,
-
Но при оформлении заказа — только один сможет его купить.
Как можно обойти?
Переносим резервирование товара на этап добавления в корзину.
Когда клиент добавляет товар — мы сразу его резервируем.
Возможный кейс:
Клиент добавил товар, но не оформил заказ — например, ушёл от компьютера.
Товар остаётся заблокированным.
Решение:
Устанавливаем временное ограничение на резервирование (например, 15 минут).
Если клиент не оформляет заказ — товар возвращается на склад.
На этапе оформления заказа
Поскольку товар уже зарезервирован, на этом этапе мы просто подтверждаем заказ.
Можно пойти двумя путями:
-
Сразу списать товар при отправке заказа, чтобы он не разблокировался,
-
Обнулить резерв и списать товар после оплаты.
Личный выбор:
Я склоняюсь к первому варианту. Если заказ не оплатят — просто вернём значения на склад.
На этом все
И помните, что эта задача из реального собеседования.
Когда вы её решаете, то на это есть всего 15-20 минут времени и интервьюер хочет понять:
-
какую теоретическую базу вы знаете,
-
как вы мыслите,
-
как умеете применять знания на практике.
ссылка на оригинал статьи https://habr.com/ru/articles/934170/
Добавить комментарий