보상 트랜잭션이란
보상 트랜잭션은 분산 시스템에서 여러 로컬 트랜잭션을 순차적으로 수행하다가 중간에 실패했을 때, 이미 성공한 단계를 업무적으로 취소(보상)하여 일관된 상태로 되돌리는 전략이다. 주로 Saga 패턴에서 사용하며, 2PC와는 다른 접근이다.
2PC와의 차이
- 2PC는 코디네이터가 참여자를 prepare/commit 단계로 묶어 전체를 하나의 분산 트랜잭션처럼 처리한다. 강한 원자성을 지향하지만 락 점유와 블로킹 부담이 크다.
- 보상 트랜잭션(Saga)은 각 서비스가 자신의 로컬 트랜잭션을 커밋하고, 이후 단계가 실패하면 보상 트랜잭션을 실행한다.
- 보상 트랜잭션은 즉시 강한 일관성 대신 최종 일관성(eventual consistency)을 목표로 한다.
- 따라서 보상 트랜잭션이 2PC를 따르는 것이 아니라, 보통 2PC를 적용하기 어려운 환경에서 선택하는 대안적 복구 모델에 가깝다.
Saga에서의 실행 흐름
주문 처리 흐름을 예로 들면 다음과 같다.
- T1: 주문 서비스가 주문 생성(로컬 커밋)
- T2: 결제 서비스가 결제 승인(로컬 커밋)
- T3: 재고 차감 단계에서 실패
- C2: 결제 취소(보상 트랜잭션)
- C1: 주문 취소(보상 트랜잭션)
즉, T1 -> T2 -> 실패 -> C2 -> C1 형태로 진행되며, 실패 시점까지 성공한 단계를 역순으로 보상한다.
실무 설계 포인트
- 멱등성: 보상 트랜잭션은 중복 실행되어도 결과가 같아야 한다.
- 재시도 정책: 일시 장애를 고려해 재시도 횟수, 백오프, 데드레터 처리 기준을 정해야 한다.
- 순서 보장: 이벤트/메시지 기반이라면 같은 aggregate에 대한 처리 순서를 보장해야 한다.
- 관찰성: saga id, 상태 전이 로그, 보상 실행 이력을 남겨 장애 분석이 가능해야 한다.
정리
보상 트랜잭션은 Saga의 실패 복구 메커니즘이며 2PC와 동일한 기술이 아니다. 분산 시스템에서 강한 원자성 대신 최종 일관성을 선택할 때 유용하고, 멱등성/재시도/순서 보장/관찰성을 함께 설계해야 안정적으로 운영할 수 있다.