주문 생성 사가는 어떤 사가 참여자가 주문을 거부해서 실패 이벤트가 발행되는 경우(예: 소비자 신용카드 승인 거부)를 대비해야 합니다. 이런 일이 발생하면 사가는 어떻게든 보상 트랜잭션을 가동하여 이미 수행한 작업을 언두해야 합니다. 예를 들어 회계 서비스에서 소비자 신용카드가 승인 거부된 경우, 이벤트 순서는 다음과 같습니다(그림 4-5).
1. 주문 서비스: 주문을 APPROVAL_PENDING 상태로 생성 → 주문 생성 이벤트를 발행합니다.
2. 소비자 서비스: 주문 생성 이벤트 수신 → 소비자가 주문을 할 수 있는지 확인 → 소비자 확인 이벤트를 발행합니다.
3. 주방 서비스: 주문 생성 이벤트 수신 → 주문 내역 확인 → 티켓 상태를 CREATE_PENDING으로 생성 → 티켓 생성 이벤트를 발행합니다.
4. 회계 서비스: 주문 생성 이벤트 수신 → 신용카드 승인을 PENDING 상태로 생성합니다.
5. 회계 서비스: 티켓 생성 및 소비자 확인 이벤트 수신 → 소비자 신용카드 과금 → 신용카드 승인 실패 이벤트를 발행합니다.
6. 주방 서비스: 신용카드 승인 실패 이벤트 수신 → 티켓 상태를 REJECTED로 변경합니다.
7. 주문 서비스: 신용카드 승인 실패 이벤트 수신 → 주문 상태를 REJECTED로 변경합니다.