🌳 고급 architecture
MSA에서 트랜잭션은 어떻게 관리하나요?
쉽게 이해하기
온라인 쇼핑에서 주문, 결제, 배송이 각각 다른 부서라고 생각해보세요. 결제가 실패하면 주문을 취소하고, 재고를 다시 복구해야 하죠. 하지만 각 부서가 독립적이라 한 번에 롤백할 수 없어요. 대신 '보상 트랜잭션'으로 하나씩 되돌리는 거예요. 결제 취소 → 주문 취소 → 재고 복구처럼요.
핵심 정리
마이크로서비스에서는 여러 서비스에 걸친 작업을 Saga 패턴으로 관리해요.
자세히 알아보기
전통적인 모놀리식 시스템에서는 데이터베이스 트랜잭션으로 여러 작업을 원자적으로 처리할 수 있어요. 하지만 마이크로서비스는 각 서비스가 독립된 데이터베이스를 쓰기 때문에, 분산 트랜잭션이 필요해요.
Saga 패턴은 두 가지 방식이 있어요. 첫째, 'Choreography(안무)' 방식이에요. 각 서비스가 이벤트를 발행하고 다른 서비스가 반응해요. 주문 서비스가 '주문 생성됨' 이벤트를 발행하면, 결제 서비스가 듣고 결제를 시도하고, 성공하면 '결제 완료' 이벤트를 발행하는 식이죠. 결합도가 낮지만, 흐름을 추적하기 어려워요.
둘째, 'Orchestration(지휘)' 방식이에요. 중앙 조정자가 각 단계를 순서대로 호출해요. 주문 Saga가 결제 서비스 호출 → 재고 서비스 호출 → 배송 서비스 호출을 관리하는 거죠. 흐름이 명확하지만, 조정자가 단일 장애점이 될 수 있어요.
보상 트랜잭션도 중요해요. 중간 단계에서 실패하면 이미 완료된 단계를 역순으로 취소해야 해요. 결제가 실패하면 주문을 취소하고, 재고를 복구하는 식이죠. 각 서비스는 '보상 API'를 제공해야 하고, 멱등성을 보장해야 해요.
실무에서는 이벤트 소싱과 함께 쓰는 경우가 많아요. 모든 상태 변화를 이벤트로 기록해서, 문제가 생기면 이벤트를 재생해서 복구할 수 있어요. Netflix, Uber 같은 대규모 MSA 시스템이 이 방식을 사용해요.