Temporal로 보상(Saga) 트랜잭션 다루기
· 약 2분
여러 서비스에 걸친 작업을 하나의 트랜잭션으로 묶을 수 없을 때, 보상(Saga) 패턴과 Temporal 워크플로우로 안전하게 되돌리는 방법을 정리합니다.
여러 서비스에 걸친 작업에는 한 번에 되돌릴 공통 롤백이 없습니다. 그래서 단계마다 "되돌리기(보상)"를 짝지어 두고, 실패하면 성공한 단계를 역순으로 취소합니다.
이 순서를 손으로 추적하는 대신 워크플로우 엔진(Temporal)에 맡길 수 있습니다.
분산 트랜잭션이 왜 어려운가
분산 트랜잭션이 어려운 이유는, 여러 서비스(또는 외부 시스템)에 걸친 작업을 하나의 DB 트랜잭션으로 묶을 수 없기 때문입니다. 한 DB 안의 작업은 COMMIT/ROLLBACK으로 전부 성공 또는 전부 취소가 되지만, 결제 서비스와 재고 서비스가 따로 있으면 그런 공통 롤백이 없습니다.
예를 들어 "결제 → 재고 차감 → 배송 등록"에서 결제는 됐는데 재고 차감이 실패하면, 이미 나간 결제를 따로 되돌려(환불) 줘야 합니다. 아무도 대신 되돌려 주지 않으니 직접 되돌립니다.
