У вас есть 2 варианта, в зависимости от того, принимаете ли вы возможную последовательность или нет.
Используя немедленную согласованность, у меня будет OrderService, который получает запрос заказа и выполняет асинхронные вызовы AccountService.ReservePayment () и StockService.ReserveStock (). В случае сбоя любого из них вы вызываете AccountService.UndoReservePayment () и StockService.UndoReserveStock (). Если оба успешны, Вы вызываете AccountService.CompleteReservePayment () и StockService.CompleteReserveStock (). Убедитесь, что у каждой резервной копии есть временная метка, чтобы процесс демона мог иногда запускаться и отменять любые резервы, которые старше часа или около того.
Этот подход заставляет пользователя ждать завершения обеих этих служб. Если либо StockService, либо AccountService работают медленно, взаимодействие с пользователем будет медленным. Я предлагаю лучший способ сделать это - подход с возможной последовательностью, который дает пользователю очень быстрый опыт за счет получения сообщений об ошибках после факта.
При возможной последовательности вы предполагаете, что у них достаточно кредита, и у вас естьдостаточно инвентаря, и в ответ на их запрос заказа вы сразу же отправите обратно сообщение об успехе. Пользователь доволен, и они идут покупать больше вещей.
Событие OrderCreated затем обрабатывается асинхронно, чтобы зарезервировать акции и кредит, как описано выше. Однако, поскольку нет времени, чтобы ответить ожидающему пользователю, вам не нужно увеличивать масштаб, чтобы справиться с высокой пропускной способностью. Если проверка кредитоспособности и проверка запасов занимают минуту или две, пользователю все равно, потому что он занимается другими делами.
Цена, которую вы платите здесь, заключается в том, что пользователь может получить сообщение об успехе во времяотправьте заказ, а через несколько минут получите электронное письмо с сообщением о том, что распродажа не состоялась, потому что на складе нет. Это то, что делают многие крупные ритейлеры, в том числе Amazon, Target, Walmart и т. Д. Конечная согласованность может иметь большое значение для облегчения загрузки и стоимости серверной части.