SAGA patterns

2025. 2. 28. 17:41Spring Microservice

📌 SAGA 패턴이란?

SAGA 패턴은 마이크로서비스 아키텍처에서 분산된 트랜잭션을 관리하는 패턴입니다.
단일 데이터베이스 트랜잭션을 사용하기 어려운 마이크로서비스 환경에서, 데이터 일관성을 유지하기 위한 방법으로 활용됩니다.

🔹 1. 왜 SAGA 패턴이 필요한가?

마이크로서비스 환경에서는 각 서비스가 개별 데이터베이스를 관리하는 경우가 많습니다.
이때, 하나의 비즈니스 로직이 여러 마이크로서비스에 걸쳐 수행되는 경우가 발생할 수 있습니다.

전통적인 데이터베이스 트랜잭션(ACID) 문제

  • 단일 모놀리식 시스템에서는 ACID(Atomicity, Consistency, Isolation, Durability) 트랜잭션을 활용하여 데이터 일관성을 유지할 수 있음.
  • 하지만 마이크로서비스 환경에서는 서로 다른 DB에 걸친 트랜잭션을 직접 관리하기 어려움.
  • 예제:
    • "사용자가 제품을 구매하면, 주문 서비스결제 서비스가 각각 다른 데이터베이스에서 동작."
    • 주문이 생성되었지만 결제 과정에서 실패하면 롤백(Rollback) 문제가 발생.

📌 해결책SAGA 패턴을 활용하여 서비스 간 분산 트랜잭션을 관리.

🔹 2. SAGA 패턴의 동작 방식

SAGA 패턴은 하나의 긴 트랜잭션을 여러 개의 작은 트랜잭션(로컬 트랜잭션)으로 나누어 관리합니다.
각 로컬 트랜잭션이 성공적으로 실행되면 다음 서비스가 호출되며, 어느 한 트랜잭션이 실패하면 보상 작업(Compensating Transaction)을 실행하여 롤백을 수행합니다.

SAGA의 두 가지 구현 방식

  1. 오케스트레이션 기반 SAGA (Orchestration-based SAGA)
  2. 코레오그래피 기반 SAGA (Choreography-based SAGA)

🔹 3. SAGA 패턴의 구현 방식

1️⃣ 오케스트레이션 기반 SAGA (Orchestration-Based SAGA)

  • 중앙 컨트롤러(SAGA Coordinator)가 전체 트랜잭션을 관리하고 조정.
  • 중앙 컨트롤러가 각 서비스에 트랜잭션을 실행하라고 지시하며, 실패 시 보상 작업을 수행.

출처 : https://microservices.io/patterns/data/saga.html

 

동작 방식

  1. 클라이언트가 SAGA Coordinator에게 트랜잭션 요청.
  2. Coordinator가 첫 번째 서비스(예: Order Service)에 트랜잭션 실행 요청.
  3. Order Service가 성공하면, 다음 서비스(예: Payment Service)에 요청을 전달.
  4. 모든 서비스가 성공하면 최종적으로 완료.
  5. 특정 서비스가 실패하면, Coordinator가 이전 서비스에 보상 트랜잭션(Compensation Transaction) 실행 요청.

장점
✔ 중앙 집중 제어가 가능하여 트랜잭션 흐름을 명확하게 관리.
✔ 트랜잭션 실행 순서를 쉽게 변경 가능.

단점
Coordinator가 단일 장애점(Single Point of Failure, SPOF)이 될 가능성 있음.
❌ Coordinator의 부하가 증가하면 성능 이슈 발생 가능.

📌 대표적인 구현 기술: Camunda, Temporal, Axon Framework

2️⃣ 코레오그래피 기반 SAGA (Choreography-Based SAGA)

  • 중앙 조정자 없이, 각 서비스가 이벤트 기반으로 트랜잭션을 관리.
  • 각 서비스는 특정 이벤트를 구독(Subscribe)하고, 이벤트가 발생하면 자체적으로 트랜잭션을 실행.

출처 : https://microservices.io/patterns/data/saga.html

 

동작 방식

  1. Order Service가 주문 생성 후 "Order Created" 이벤트를 발행(Publish).
  2. Payment Service가 이벤트를 구독(Subscribe)하고 결제 진행 후 "Payment Successful" 이벤트 발행.
  3. Inventory Service가 이벤트를 구독하고 재고 감소 처리 후 "Stock Updated" 이벤트 발행.
  4. 모든 서비스가 성공하면 최종 완료.
  5. 특정 서비스가 실패하면, 해당 서비스가 보상 트랜잭션을 실행하여 롤백.

장점
✔ 중앙 조정자 없이 서비스 간 결합도를 낮출 수 있음.
확장성이 뛰어나며, 여러 서비스가 동적으로 추가 가능.

단점
❌ 서비스 간 이벤트 흐름이 복잡해질 수 있으며 디버깅이 어려움.
❌ 이벤트 로깅 및 추적을 위한 추가적인 모니터링 도구 필요.

📌 대표적인 구현 기술: Apache Kafka, RabbitMQ, NATS, AWS SNS/SQS

🔹 4. SAGA 패턴 예제

예제 시나리오: 온라인 주문 시스템

  • 서비스 구성: Order Service, Payment Service, Inventory Service
  • 트랜잭션 흐름
    1. Order Service → 주문 생성 요청
    2. Payment Service → 결제 진행
    3. Inventory Service → 재고 감소
    4. 주문 완료

📌 실패 시 보상 트랜잭션 예제

  • Payment Service에서 결제 실패 → Order Service주문을 취소하는 보상 트랜잭션 실행.
  • Inventory Service에서 재고 부족 → Payment Service결제를 취소하는 보상 트랜잭션 실행.

🔹 5. SAGA 패턴의 장점과 단점

장점
✔ 마이크로서비스 환경에서 데이터 일관성을 유지할 수 있음.
✔ 분산 시스템에서 트랜잭션 롤백이 가능하여 신뢰성 증가.
이벤트 기반 아키텍처와 결합하여 확장성 높은 설계 가능.

단점
구현이 복잡하며, SAGA Coordinator 또는 이벤트 기반 설계가 필요.
데이터 정합성 유지가 어렵고, 보상 트랜잭션 설계가 필수적.
트랜잭션이 여러 단계로 나뉘어져 있어 지연(Latency) 발생 가능.

🔹 6. SAGA 패턴 vs. 2PC (Two-Phase Commit)

비교 항목 SAGA 패턴 2PC (Two-Phase Commit)
트랜잭션 방식 분산 트랜잭션을 작은 로컬 트랜잭션으로 처리 모든 서비스가 한 번에 커밋 또는 롤백
데이터 일관성 Eventually Consistent (최종적 일관성) Strong Consistency (강한 일관성)
실패 처리 보상 트랜잭션으로 롤백 모든 서비스가 롤백됨
확장성 이벤트 기반으로 확장성 높음 참여 서비스가 많아질수록 성능 저하
적용 환경 마이크로서비스, 비동기 이벤트 단일 데이터베이스, 강한 트랜잭션 요구

📌 2PC는 강한 일관성을 보장하지만 확장성이 낮고, SAGA는 확장성이 뛰어나지만 데이터 일관성을 유지하기 위한 설계가 필요.

📌 Summary

SAGA 패턴은 마이크로서비스 환경에서 분산 트랜잭션을 관리하는 대표적인 방법.
오케스트레이션 방식은 중앙 집중적 관리가 가능하지만 SPOF 문제가 있음.
코레오그래피 방식은 이벤트 기반으로 확장성이 뛰어나지만 디버깅이 어려움.
트랜잭션 실패 시 보상 트랜잭션을 설계해야 함.

💡 마이크로서비스 환경에서는 ACID 트랜잭션 대신 SAGA 패턴을 활용하여 최종적 일관성(Eventual Consistency)을 유지하는 것이 중요함. 🚀