Saga

Saga는 성공한 로컬 커밋만 역순 보상한다

각 서비스는 자기 DB에 먼저 커밋하고 다음 단계로 이동한다. 중간 실패가 나면 이미 성공한 단계들을 업무적으로 반대 의미의 명령으로 되돌린다.

정상 진행

1 주문 생성 커밋

orderId와 PENDING_ORDER를 저장한다.

2 재고 예약 커밋

reservationId와 예약 수량을 남긴다.

3 결제 승인 시도

성공하면 COMPLETED, 실패하면 보상으로 전환한다.

결제 실패 후 보상

C1 예약 해제

성공했던 재고 예약을 한 번만 해제한다.

C2 주문 취소

주문 상태를 CANCELLED로 바꾸고 취소 이벤트를 남긴다.

END 관찰

COMPENSATED, FAILED_AT, retry count를 대시보드에 노출한다.

saga_state가 필요한 이유

completed steps, failed_at, next_compensation을 저장해야 재시도와 중복 실행이 안전해진다.

보상은 rollback이 아님

반대 의미의 새 업무 작업이다.

멱등성 필수

보상 명령도 여러 번 도착할 수 있다.

중간 상태 노출

사용자에게 진행 중 상태를 숨기지 않는다.