Как сохранить корректность брони во время межканистрового вызова
Исходящий асинхронный вызов может разделить обновление на несколько исполнений. До обработки ответа другое сообщение успевает изменить бронь.
Присвойте брони версию
До обращения к реестру присвойте брони товара 7 постоянный идентификатор, запишите сумму и состояние ожидания. После await прочитайте бронь снова. Сравнение идентификатора не даст запоздалому обработчику выдать товар по новой брони с тем же номером позиции.
message 1: reserve item 7 → await ledger
message 2: cancel request for item 7
callback: examine reservation version before delivery
Разберите запоздалое подтверждение
Если отмена поступила во время оплаты, реестр всё ещё может подтвердить перевод. Направьте бронь на сверку со ссылкой на перевод. Аварийное завершение обработчика откатит изменения этого обработчика, а ранее зафиксированное состояние и внешний перевод сохранятся.