재고 실패와 결제 실패 보상

재고가 거절되면 결제를 호출하지 않는다 · 결제가 거절되면 재고를 해제한 뒤 Failed로 끝난다

재고 실패와 결제 실패 보상 재고가 거절되면 결제를 호출하지 않는다 · 결제가 거절되면 재고를 해제한 뒤 Failed로 끝난다 ReserveInventoryReq ReserveInventoryRes [Inventory rejected] Append InventoryReservationFailedEvent Append OrderFailedEvent Apply Failed [Inventory accepted] Append InventoryReservedEvent Apply InventoryReserved AuthorizePaymentReq AuthorizePaymentRes [Payment rejected] Append PaymentFailedEvent ReleaseInventoryReq ReleaseInventoryRes Append InventoryReleasedEvent Append OrderFailedEvent Apply Failed [Payment accepted] Append PaymentAuthorizedEvent Apply PaymentAuthorized Append OrderConfirmedEvent Apply Confirmed OrderWorkflow · / Order Spot · Sequence participant OrderWorkflow / Order Spot Inventory · Sequence participant Inventory Payment · Sequence participant Payment Order Event Store · Sequence participant Order Event Store Order Read Model · Sequence participant Order Read Model

mermaid alt/else 분기 구조 (archify에는 alt/else 표현이 없어 평평하게 폈다)

  • • alt Inventory rejected → 3~5번만 실행, Payment는 호출하지 않는다.
  • • else Inventory accepted → 6~9번을 실행한 뒤 { alt Payment rejected → 10~15번 / else Payment accepted → 16~19번 } 중 하나만 실행한다(상호 배타적).

보상 순서

  • • 재고 예약이 거절되면 Payment module을 호출하지 않는다. Payment가 거절되면 이미 기록한 ReservationId로 해제를 요청하고, 해제 결과와 OrderFailedEvent를 순서대로 기록한다.
  • • 재고와 결제 module은 같은 결정적 ID를 다시 받은 경우 최초 결과를 반환해야 한다.