Такие разборы задач отлично помогают потренироваться в подходах к решению рабочих задач + увеличить насмотренность.
Задача
Сценарий:
У нас есть e-commerce платформа, состоящая из:
веб-приложения,
брокера сообщений,
бэкенда.
Клиенты могут заказывать товары, а складская система проверяет наличие товаров на складе.
Каждый раз, когда клиент делает заказ, система отправляет запрос через брокер для проверки доступности товара на складе и блокирует его на время обработки заказа.
Проблема:
Клиенты могут:
добавлять несколько товаров в корзину одновременно,
отправлять несколько заказов.
Это приводит к тому, что резервируется больше товара, чем есть на складе.
Из-за этого возможны ситуации, когда товар отображается как доступный, но при попытке завершить заказ оказывается, что он уже заблокирован другим клиентом.
Необходимо:
Выявить процессы, которые происходят,
На основе этих процессов отобразить схему (sequence diagram) взаимодействия,
Предложить 2 способа оптимизации, чтобы избавиться от текущих проблем.
Решение
Выделим процессы, которые есть из описания задачи и разделим их на:
бизнес-процессы,
системные взаимодействия.
Начнём с бизнес-процессов
1. Добавление товара в корзину
проверка наличия товара на складе.
2. Оформление заказа
отправка полного списка товаров, которые выбрал клиент,
резервирование товаров для дальнейшего списания после оплаты.
Выделять больше процессов не вижу смысла - пока достаточно.
Теперь «как это выглядит под капотом»
Выделим компоненты системы:
Веб-приложение,
Бэкенд,
Брокер сообщений,
Сервис склада.
Добавление товара:
Клиент добавляет товар в корзину,
Веб-приложение отправляет запрос на добавление товара в корзину на бэкенд,
Бэкенд отправляет запрос на проверку наличия товара на складе через брокер,
Сервис склада вычитывает сообщение и сообщает, есть товар или нет,
Бэкенд возвращает ответ веб-приложению - можно добавить товар или нет.
Оформление заказа:
У клиента собрана корзина,
Он нажимает «Оформить»,
Веб-приложение отправляет запрос на бэкенд со списком товаров и количеством,
Бэкенд отправляет сообщение на резервирование товара через брокер,
Сервис склада вычитывает сообщение и резервирует товар или отклоняет запрос,
Бэкенд возвращает результат в веб-приложение,
При успешном резервировании - переходим к оплате, при неуспехе - отклоняем заказ.

Получилась ситуация AS IS
Теперь на основе этой диаграммы можем предложить изменения, которые помогут решить исходную проблему.
Напомню условия задачи:
> Клиенты могут добавлять несколько товаров в корзину одновременно и отправлять несколько заказов → резервируется больше товара, чем есть на складе → товар отображается как доступный, но при оформлении оказывается уже зарезервирован.
Первая неэффективность
Несколько клиентов добавили товар в корзину, но никто не зарезервировал его за собой.
Пример:
У нас 1 кг бананов на складе,
Три клиента добавили этот килограмм в корзину,
Для каждого товар отображается как доступный,
Но при оформлении заказа - только один сможет его купить.
Как можно обойти?
Переносим резервирование товара на этап добавления в корзину.
Когда клиент добавляет товар - мы сразу его резервируем.
Возможный кейс:
Клиент добавил товар, но не оформил заказ — например, ушёл от компьютера.
Товар остаётся заблокированным.
Решение:
Устанавливаем временное ограничение на резервирование (например, 15 минут).
Если клиент не оформляет заказ - товар возвращается на склад.

На этапе оформления заказа
Поскольку товар уже зарезервирован, на этом этапе мы просто подтверждаем заказ.
Можно пойти двумя путями:
Сразу списать товар при отправке заказа, чтобы он не разблокировался,
Обнулить резерв и списать товар после оплаты.
Личный выбор:
Я склоняюсь к первому варианту. Если заказ не оплатят - просто вернём значения на склад.

На этом все
И помните, что эта задача из реального собеседования.
Когда вы её решаете, то на это есть всего 15-20 минут времени и интервьюер хочет понять:
какую теоретическую базу вы знаете,
как вы мыслите,
как умеете применять знания на практике.
Комментарии (7)
anzay911
05.08.2025 10:58Надеюсь, у вас нет конкурентов. Просто мне с дивана видно, как можно задидосить эту систему.
proanalitika Автор
05.08.2025 10:58а где диван можно прикупить? Хочу видеть также качественно. Шутка.
А про ddos, любую систему можно забомбить при первом взгляде.
musk
05.08.2025 10:58Когда клиент добавляет товар - мы сразу его резервируем.
Товар остаётся заблокированным.
Если клиент не оформляет заказ - товар возвращается на склад.Это плохое решение. "Заабьюзить" сервис можно запросто. К примеру, я сделаю скрипт, который каждые 15 минут тупо добавляет товар обратно в корзину. У других практически нет шансов тогда купить товар. Если резервировать на этапе оформление заказа, то тут надо рассмотреть этот же вариант, к примеру, самое примитивное решение - при отказе или таймауте оплаты, позволять перейти к новому оформлению заказа не ранее, чем через 5 минут.
Сразу списать товар при отправке заказа, чтобы он не разблокировался
Это не понял, что значит. То есть, еще на заплатили, а товар уже списан? Тогда однозначно - нет.
Ввиду вышесказанного, я бы процесс сделал так:
1. Добавляются товары в корзину с обновлением доспупности для ранее добавленных и соответствующими предупреждениями.
2. Переход к оформлению заказа - тут происходит резервирование товаров на 15 мин (если доступны все еще, если нет, то предупреждать в соответствии).
3. Списание товаров только по факту оплаты, то есть по нажатию на кнопку "оплатить". Причем учесть процесс продолжения действия, если оплата и списание не выполняются атомарно и произошла ошибка. То есть чтобы не получилось так, что оплата произведена, а списание не произошло, и наоборот. Тут можно придумать много чего, к примеру, сохранять идентификатор сеанса оформления заказа и при повторной попытке проверять что было реально сделано.
4. Если опалата не была произведена по таймауту или заказ был отменен, добавить таймаут на новое оформление. Добавлять товары тем не менее можно.
Dhwtj
05.08.2025 10:58Думаю, неплохое решение это на витрине и в корзине указывать что товара мало, высокий риск что между помещением его в корзину и заказом его заберут.
Резервирование происходит в момент нажатия кнопки заказать. Теперь у вас есть 5-10 минут на подтверждение оплаты.
Akina
Не нравится мне это решение. С какого перепугу один на час отошёл, а остальные 15 минут должны сосать лапу?
По-моему, достаточно сказать, что на текущий момент доступно XXX единиц товара. А вот в момент оформления проверить наличие запрошенных YYY единиц, и при наличии - резервировать. А если другие уже выгребли половину - ну сказать "Извини, пока ты тут телился, осталось только ZZZ единиц, остальное раскупили, корректировать будем?". Во-первых, дело житейское, во-вторых, последствия за неоперативность - у самогО покупателя, а не у его "конкурентов". Не можешь шевелиться - страдай, и это справедливо.
А тайм-аут в 15 минут - это уже время на оформление и оплату заказа, когда корзина сформирована и зафиксирована.
proanalitika Автор
А как вы будете отрабатывать негатив клиента, который собрал корзину, а потом ему говорят, сорян, товар закончился?
«Не можешь шевелиться - страдай, и это справедливо» – разочарую. Ни один бизнес на такое не пойдет так как надо удерживать клиентов
Akina
А никак. Если ты в оффлайн-магазине встал в очередь за вкусняшкой, а к тому моменту, как подошла твоя очередь, вкусняшка кончилась, то ты правда думаешь, что магазин станет реагировать на твой негатив? Максимум - скажут "Приходите завтра, авось подвезут".
Что лучше - удержать одного клиента-тормоза, или десяток клиентов, которые не обнаружили нужного (количества) товара, потому что этот тормоз его заблокировал?
Бизнесу нужен клиент, который купит, а не который только зарезервирует.