본 시스템은 MSA(Microservices Architecture) 환경에서 Saga 패턴을 이용하여 분산 트랜잭션을 관리합니다. Saga 패턴은 Orchestration(오케스트레이션) 방식과 Choreography(코레오그래피) 방식 두 가지로 구현됩니다.
Saga 패턴이란? 왜 필요한가? MSA(Microservices Architecture)에서는 개별 서비스가 독립적으로 운영되기 때문에 기존의 데이터베이스 트랜잭션(ACID)을 유지하기 어렵습니다. 예를 들어, 주문 시스템에서 주문이 생성되면 결제와 배송이 차례로 진행되어야 하지만, 하나의 서비스에서 오류가 발생하면 이전 단계의 처리를 되돌려야 합니다.
Saga 패턴은 이러한 분산 트랜잭션 문제를 해결하기 위한 전략입니다. Saga는 여러 개의 **작은 로컬 트랜잭션(Local Transaction)**으로 구성되며, 각 단계에서 이벤트를 주고받으며 전체적인 트랜잭션 흐름을 유지합니다. 만약 중간에 실패하면, 이전 단계에서 **보상 트랜잭션(Compensating Transaction)**을 실행하여 일관성을 유지합니다.
오케스트레이션 방식은 **중앙 오케스트레이터(Saga Orchestrator)**가 전체 트랜잭션의 흐름을 제어합니다. 각 서비스는 오케스트레이터로부터 명령을 받아 실행됩니다.
- 사용자가 주문을 생성하면 오케스트레이터가 주문 생성 이벤트를 발행합니다.
- 오케스트레이터는 결제 서비스에 결제 요청을 보냅니다.
- 결제가 성공하면 배송 서비스에 배송 요청을 보냅니다.
- 전체 프로세스가 성공하면 주문이 완료됩니다.
- 하나라도 실패하면 오케스트레이터가 보상 트랜잭션을 실행하여 롤백합니다.
✅ 중앙 집중적 관리: 전체 비즈니스 로직을 중앙에서 관리하여 트랜잭션 흐름이 명확합니다.
✅ 오류 처리 용이: 실패 시 보상 트랜잭션을 한 곳에서 관리할 수 있습니다.
✅ 재시도 로직 가능: 오케스트레이터가 실패한 작업을 감지하고 재시도할 수 있습니다.
❌ 단일 장애점(Single Point of Failure): 오케스트레이터가 장애를 일으키면 전체 트랜잭션이 멈출 수 있습니다.
❌ 확장성 문제: 중앙에서 모든 프로세스를 제어하므로 서비스가 많아질수록 복잡성이 증가할 수 있습니다.
❌ 높은 결합도: 서비스 간의 독립성이 떨어질 수 있습니다.
코레오그래피 방식에서는 각 서비스가 이벤트를 주고받으며 자체적으로 트랜잭션을 수행합니다. 중앙 제어 역할 없이 서비스 간의 이벤트 흐름만 존재합니다.
- 주문 서비스가 주문 생성 이벤트를 발행합니다.
- 결제 서비스가 이벤트를 수신하여 결제 진행 후, 결제 완료 이벤트를 발행합니다.
- 배송 서비스가 결제 완료 이벤트를 수신하고 배송을 수행합니다.
- 만약 특정 서비스에서 실패하면 실패 이벤트를 발행하여 이전 서비스가 보상 트랜잭션을 수행합니다.
✅ 높은 확장성: 서비스가 독립적으로 동작하므로 확장성이 뛰어납니다.
✅ 단일 장애점 없음: 중앙 집중식 관리가 없으므로 특정 서비스 장애가 전체 시스템 장애로 이어지지 않습니다.
✅ 유연한 이벤트 흐름: 새로운 서비스가 추가될 때 기존 서비스의 수정 없이 이벤트 구독만 하면 됩니다.
❌ 트랜잭션 흐름 파악이 어려움: 여러 서비스가 이벤트를 주고받기 때문에 전체 트랜잭션 흐름을 추적하기 어렵습니다.
❌ 보상 트랜잭션 구현 어려움: 특정 서비스가 실패했을 때 어떤 보상 조치가 필요한지 정의하는 것이 어렵습니다.
❌ 디버깅 난이도 증가: 이벤트 기반 아키텍처에서 버그가 발생하면 원인을 찾기 어렵습니다.
기준 | 오케스트레이션 기반 | 코레오그래피 기반 |
---|---|---|
확장성 | 낮음 | 높음 |
장애 대응력 | 단일 장애점 존재 | 서비스 독립적 운영 |
트랜잭션 가시성 | 높음 | 낮음 |
유지보수 용이성 | 쉬움 | 어려움 |
서비스 간 결합도 | 높음 | 낮음 |
디버깅 편의성 | 쉬움 | 어려움 |
- 중앙 집중식 관리가 필요하고 보상 트랜잭션이 명확한 경우 → 오케스트레이션 방식 추천
- 서비스 독립성을 유지하고 확장성을 중시하는 경우 → 코레오그래피 방식 추천
주문 시스템에서 Saga 패턴을 적용할 때, 오케스트레이션 방식과 코레오그래피 방식 중 어느 것을 선택할지는 시스템의 요구사항에 따라 달라집니다.
- 트랜잭션 일관성이 중요한 경우 → 오케스트레이션
- 확장성과 독립성이 중요한 경우 → 코레오그래피
각 방식의 장단점을 고려하여 최적의 방식을 선택하는 것이 중요합니다.