1. SAGA 패턴: 분산 트랜잭션 관리 기법
마이크로서비스 아키텍처(MSA)는 서비스별 독립적인 데이터베이스 사용을 권장한다(Database-per-Service). 이는 서비스 자율성과 기술 다양성을 높이지만, 여러 서비스에 걸쳐 비즈니스 로직을 처리해야 할 때 데이터 일관성을 유지하기 어렵게 만든다.
예를 들어, 전자상거래 시스템에서 주문 생성(order-service), 결제 처리(payment-service), 재고 감소(inventory-service), 배송 시작(shipping-service)은 각각 다른 서비스와 데이터베이스에서 처리될 수 있다.
이 모든 과정이 하나의 원자적인 트랜잭션처럼 동작해야 하지만, 전통적인 2단계 커밋(2PC) 방식은 MSA 환경의 동기적 차단과 병목 문제로 인해 적합하지 않은 경우가 많다. 이러한 분산 트랜잭션(Distributed Transaction) 문제를 해결하기 위한 패턴 중 하나가 바로 SAGA이다.
2. SAGA 패턴이란 무엇인가?
SAGA는 하나의 긴 트랜잭션을 여러 개의 짧은 로컬 트랜잭션(Local Transaction)으로 나누어 순차적으로 실행하는 방식이다. 각 로컬 트랜잭션은 해당 마이크로서비스 내에서 원자적으로 완료된다. SAGA의 핵심은 모든 로컬 트랜잭션이 성공적으로 완료되면 전체 분산 트랜잭션이 성공한 것으로 간주하고, 만약 중간 단계에서 로컬 트랜잭션이 실패하면 이전 단계들에서 성공했던 로컬 트랜잭션들을 취소(Rollback)하는 메커니즘을 제공하는 것이다.
3. 보상 트랜잭션 (Compensating Transaction)
SAGA 패턴에서 롤백을 수행하는 메커니즘을 보상 트랜잭션(Compensating Transaction)이라고 한다. 각 로컬 트랜잭션(T1, T2, ..., Tn)에 대해, 해당 트랜잭션이 남긴 변경 사항을 취소하는 보상 트랜잭션(C1, C2, ..., Cn-1)을 미리 정의해 두어야 한다.
예를 들어, 주문 생성(T1) -> 결제 처리(T2) -> 배송 시작(T3) 순서의 SAGA에서 결제 처리(T2)가 실패하면, 이미 성공했던 주문 생성(T1)에 대한 보상 트랜잭션(C1: 주문 취소)을 실행하여 시스템 상태를 이전으로 되돌린다.
4. SAGA 구현 방식
SAGA 패턴을 구현하는 두 가지 주요 방식이 있다.
- 코레오그래피 (Choreography) 방식: 이벤트 기반 orchestation
- 중앙 관제탑 없이, 각 서비스가 자신의 로컬 트랜잭션을 완료한 후 이벤트를 발행(Publish)하여 다음 단계를 트리거하거나 결과를 알리는 방식이다.
- 다른 서비스들은 필요한 이벤트를 구독(Subscribe)하고 있다가, 이벤트를 수신하면 자신의 로컬 트랜잭션 또는 보상 트랜잭션을 자율적으로 수행한다.
- 구현 예시: joneconsulting/practice-msa-comms 레포지토리의 saga1 브랜치가 이 방식을 사용한다. OrderService가 OrderCreatedEvent를 Kafka로 발행하면, PaymentService가 이를 구독하여 결제를 처리한다. PaymentCompletedEvent 또는 PaymentFailedEvent를 발행한다. 실패 시 OrderService는 PaymentFailedEvent를 구독하여 주문 취소(보상 트랜잭션)를 수행한다.
- 장점: 서비스 간 결합도가 낮고(Loose Coupling) 유연하며 확장성이 좋다. 새로운 참여자를 추가하기 쉽다.
- 단점: 전체 트랜잭션 흐름이 여러 서비스에 분산되어 있어 상태 추적 및 디버깅이 어렵다. 서비스 간 순환 의존성이 발생할 수 있다.
- 오케스트레이션 (Orchestration) 방식: 중앙 집중 제어
- 오케스트레이터(Orchestrator)라는 별도의 서비스(또는 컴포넌트)가 전체 분산 트랜잭션의 흐름을 중앙에서 관리하고 지시하는 방식이다.
- 오케스트레이터는 각 참여 서비스에게 수행할 로컬 트랜잭션(API 호출 등)을 명령하고, 그 결과를 받아 다음 단계를 결정하거나 실패 시 보상 트랜잭션을 직접 명령한다.
- 장점: 전체 트랜잭션의 상태와 흐름이 오케스트레이터에 명확하게 정의되어 있어 파악 및 관리가 용이하다. 참여 서비스는 비교적 단순해진다.
- 단점: 오케스트레이터가 모든 참여 서비스의 API를 알아야 하므로 결합도가 높아지고(Tighter Coupling), 오케스트레이터 자체에 로직이 집중되어 단일 실패 지점(SPOF)이 될 수 있다.
5. 통신 방식과 SAGA 구현
- 메시지 큐(MQ, 예: Kafka) 사용: 주로 코레오그래피 방식과 잘 어울린다. 이벤트 발행/구독 모델을 통해 서비스 간 비동기 통신과 느슨한 결합을 구현하기 용이하다.
- REST API (예: OpenFeign) 사용: 주로 오케스트레이션 방식과 함께 사용될 수 있다. 오케스트레이터가 동기식 API 호출을 통해 각 참여 서비스를 순차적으로 제어한다.
결론
SAGA 패턴은 MSA 환경에서 분산 트랜잭션 문제를 해결하고 데이터 일관성을 유지하기 위한 효과적인 전략이다. 코레오그래피 방식은 느슨한 결합과 유연성을 제공하지만 흐름 추적이 어렵고, 오케스트레이션 방식은 중앙 제어로 명확성은 높지만 결합도가 높아지는 트레이드오프가 있다.
시스템의 복잡도, 서비스 간 의존성, 팀 구조 등을 고려하여 적합한 구현 방식(코레오그래피 또는 오케스트레이션)과 통신 기술(MQ 또는 REST API)을 선택해야 한다. SAGA는 최종적 일관성(Eventual Consistency)을 가지므로, 실시간으로 강력한 일관성이 요구되는 경우에는 적용에 신중해야 한다.
'MSA > MSA 아키텍처' 카테고리의 다른 글
| [BASIC #1] 마이크로서비스 아키텍처의 이해: Monolithic에서 MSA까지 (0) | 2026.03.02 |
|---|---|
| [5] EDA (0) | 2025.10.20 |
| [3] CQRS (0) | 2025.10.20 |
| [2] gRPC (0) | 2025.10.20 |
| [1] OpenFeign (0) | 2025.10.20 |