마이크로서비스 아키텍처(MSA)에서 Saga 패턴은 분산 트랜잭션을 관리하는 데 사용되는 패턴입니다. MSA에서는 여러 마이크로서비스가 독립적으로 배포되고 관리되기 때문에 전통적인 데이터베이스 트랜잭션 관리 기법을 적용하기 어렵습니다. 이러한 환경에서 Saga 패턴은 트랜잭션의 일관성을 유지하는 데 중요한 역할을 합니다.
SAGA 패턴 개념
Saga 패턴은 일련의 로컬 트랜잭션으로 구성된 분산 트랜잭션을 의미합니다. 각 로컬 트랜잭션은 하나의 마이크로서비스에 의해 수행되며, 모든 로컬 트랜잭션이 성공적으로 완료되면 전체 트랜잭션이 성공한 것으로 간주됩니다. 만약 어떤 로컬 트랜잭션이 실패하면, 이전에 완료된 모든 트랜잭션을 취소하기 위해 보상 작업(compensating transaction)이 실행됩니다.
SAGA 패턴의 특징
- 분산 트랜잭션 관리: SAGA 패턴은 분산 환경에서 트랜잭션을 관리할 수 있는 방법을 제공합니다. 각 마이크로서비스는 독립적으로 로컬 트랜잭션을 처리하고, 전체적인 트랜잭션 일관성을 유지할 수 있습니다.
- 유형:
- 코레오그래피(Choreography): 각 마이크로서비스가 다른 마이크로서비스의 이벤트를 구독하여 자체적으로 트랜잭션을 처리하고, 실패 시 보상 작업을 수행합니다. 중앙 조정자가 없으며, 마이크로서비스 간의 협력이 필요합니다.
- 오케스트레이션(Orchestration): 중앙 조정자가 트랜잭션을 관리합니다. 오케스트레이터가 각 마이크로서비스에 트랜잭션 수행을 요청하고, 실패 시 보상 작업을 명령합니다. 트랜잭션 흐름을 중앙에서 관리하기 때문에 더 간단하게 구현할 수 있습니다.
- 장점:
- 확장성: MSA의 기본 목표인 확장성을 유지하면서 트랜잭션 일관성을 보장합니다.
- 유연성: 각 마이크로서비스가 독립적으로 동작하므로, 시스템의 변화에 유연하게 대응할 수 있습니다.
- 회복성: 트랜잭션 실패 시 보상 작업을 통해 시스템을 일관된 상태로 되돌릴 수 있습니다.
- 단점:
- 복잡성 증가: 트랜잭션 실패 시 보상 로직을 구현해야 하므로, 시스템의 복잡성이 증가합니다.
- 지연 시간: 여러 단계의 트랜잭션이 연쇄적으로 수행되기 때문에, 전체 트랜잭션 완료까지 시간이 더 오래 걸릴 수 있습니다.
- 일관성 문제: 잠재적인 일관성 문제를 피하기 위해 신중한 설계가 필요합니다.
예시
가령, 주문 처리 시스템에서 주문 생성, 결제 처리, 재고 확인을 각각의 마이크로서비스가 처리한다고 가정해보겠습니다. 이 경우 SAGA 패턴을 적용하면 다음과 같은 흐름이 될 수 있습니다:
- 주문 서비스가 주문을 생성합니다.
- 결제 서비스가 결제를 처리합니다.
- 재고 서비스가 재고를 확인합니다.
만약 재고 확인 단계에서 실패하면, 결제 서비스는 결제를 취소하고, 주문 서비스는 주문을 취소하는 보상 작업을 수행합니다.
SAGA 패턴의 탄생 배경
SAGA 패턴은 대규모 분산 시스템에서 트랜잭션을 관리하는 요구에서 탄생했습니다. 전통적인 모놀리식 아키텍처에서는 데이터베이스 트랜잭션 관리가 비교적 간단했지만, 마이크로서비스 아키텍처에서는 트랜잭션 관리가 훨씬 복잡해집니다. 각 서비스가 독립적으로 배포되고 관리되기 때문에 전통적인 2PC을 적용하기 어렵고, 성능과 확장성에 문제가 발생할 수 있습니다.
SAGA 패턴의 종류
Choreography based SAGA pattern
코레오그래피 기반 Saga 패턴은 마이크로서비스 아키텍처(MSA)에서 트랜잭션을 관리하기 위한 방법 중 하나입니다. 이 패턴은 중앙 조정자 없이 각 마이크로서비스가 서로의 상태 변화에 반응하여 트랜잭션을 처리하는 방식입니다.
코레오그래피 기반 Saga 패턴의 개념
코레오그래피 기반 Saga 패턴에서는 각 마이크로서비스가 이벤트를 게시하고 구독하며, 이를 통해 트랜잭션을 처리합니다. 각 서비스는 자신의 작업을 완료한 후 관련 이벤트를 발행하고, 다른 서비스는 해당 이벤트를 구독하여 자신이 처리해야 할 작업을 수행합니다.
작동 방식
- 이벤트 발행: 하나의 마이크로서비스가 로컬 트랜잭션을 수행한 후, 성공적으로 완료되면 해당 트랜잭션의 결과를 나타내는 이벤트를 발행합니다.
- 이벤트 구독: 다른 마이크로서비스는 이 이벤트를 구독하고, 이를 통해 자신이 수행해야 할 로컬 트랜잭션을 결정합니다.
- 연속적 처리: 각 서비스가 연속적으로 이벤트를 발행하고 구독하며, 이를 통해 전체 트랜잭션이 완료됩니다.
- 보상 트랜잭션: 어느 한 서비스에서 트랜잭션이 실패하면, 해당 실패 이벤트를 발행하고 이전에 완료된 서비스들은 보상 트랜잭션을 통해 자신의 작업을 취소합니다.
예시
쇼핑 주문 처리 시스템에서 코레오그래피 기반 Saga 패턴을 적용하는 예시를 들어보겠습니다:
- 주문 서비스: 고객이 주문을 생성하면, 주문 서비스가 "주문 생성됨(Order Created)" 이벤트를 발행합니다.
- 결제 서비스: 결제 서비스는 "주문 생성됨" 이벤트를 구독하고, 결제를 처리한 후 "결제 완료됨(Payment Completed)" 이벤트를 발행합니다.
- 재고 서비스: 재고 서비스는 "결제 완료됨" 이벤트를 구독하고, 재고를 확인한 후 "재고 차감됨(Inventory Reserved)" 이벤트를 발행합니다.
- 배송 서비스: 배송 서비스는 "재고 차감됨" 이벤트를 구독하고, 배송을 준비합니다.
만약 재고 서비스에서 재고가 부족하여 트랜잭션이 실패하면 "재고 부족(Inventory Not Available)" 이벤트를 발행하고, 결제 서비스는 이를 구독하여 결제를 취소하는 보상 트랜잭션을 수행합니다. 주문 서비스도 이를 구독하여 주문을 취소하는 보상 트랜잭션을 수행합니다.
장점
- 단순성: 중앙 조정자 없이 각 서비스가 독립적으로 동작하므로 시스템이 단순해질 수 있습니다.
- 확장성: 새로운 서비스가 추가되어도 기존 서비스에 영향을 주지 않고 독립적으로 동작할 수 있습니다.
- 유연성: 서비스 간의 결합도가 낮아 변경에 유연하게 대응할 수 있습니다.
단점
- 복잡성 증가: 각 서비스가 서로의 이벤트를 처리하고 보상 트랜잭션을 구현해야 하므로, 전체 시스템의 복잡성이 증가할 수 있습니다.
- 디버깅 어려움: 분산 환경에서 이벤트를 추적하고 문제를 디버깅하는 것이 어렵습니다.
- 일관성 문제: 이벤트 기반 시스템에서 데이터 일관성을 유지하기 위해 신중한 설계가 필요합니다.
사용 사례
코레오그래피 기반 Saga 패턴은 서비스 간의 결합도를 낮추고, 독립성을 유지하며, 확장성과 유연성을 중요시하는 시스템에서 주로 사용됩니다. 그러나 이벤트 추적과 복잡성 관리가 필요하므로, 시스템 설계 시 이를 충분히 고려해야 합니다.
Orchestration based SAGA pattern
오케스트레이션 기반 Saga 패턴은 분산 트랜잭션을 관리하기 위한 또 다른 접근 방식입니다. 이 패턴에서는 중앙 조정자(Orchestrator)가 전체 트랜잭션의 흐름을 관리하고 각 마이크로서비스에 트랜잭션을 요청합니다. 중앙에서 트랜잭션을 관리함으로써 복잡성을 줄이고 일관성을 유지할 수 있습니다.
오케스트레이션 기반 Saga 패턴의 개념
오케스트레이션 기반 Saga 패턴에서는 중앙 조정자가 각 단계의 트랜잭션을 순차적으로 호출하고, 성공 여부에 따라 다음 단계를 진행하거나 보상 트랜잭션을 수행하도록 합니다.
작동 방식
- 중앙 조정자: 오케스트레이터는 전체 Saga의 시작부터 끝까지 트랜잭션의 흐름을 관리합니다.
- 단계별 호출: 오케스트레이터는 각 마이크로서비스에 로컬 트랜잭션을 요청하고, 응답에 따라 다음 단계를 진행합니다.
- 보상 트랜잭션: 만약 어느 한 단계에서 트랜잭션이 실패하면, 오케스트레이터는 이전에 완료된 트랜잭션을 취소하는 보상 트랜잭션을 순차적으로 호출합니다.
예시
쇼핑 주문 처리 시스템에서 오케스트레이션 기반 Saga 패턴을 적용하는 예시를 들어보겠습니다:
- 오케스트레이터: 주문 오케스트레이터가 트랜잭션을 시작합니다.
- 주문 서비스: 오케스트레이터가 주문 생성을 요청하고, 주문 서비스는 "주문 생성됨"을 반환합니다.
- 결제 서비스: 오케스트레이터가 결제 서비스를 호출하여 결제를 처리합니다.
- 재고 서비스: 결제가 완료되면 오케스트레이터가 재고 서비스를 호출하여 재고를 확인하고 차감합니다.
- 배송 서비스: 재고 확인이 완료되면 오케스트레이터가 배송 서비스를 호출하여 배송을 준비합니다.
만약 재고 서비스에서 재고가 부족하여 트랜잭션이 실패하면, 오케스트레이터는 다음과 같은 보상 트랜잭션을 순차적으로 호출합니다:
- 결제 서비스에 결제 취소 요청
- 주문 서비스에 주문 취소 요청
장점
- 중앙 관리: 중앙 조정자가 전체 트랜잭션을 관리하므로 복잡성이 줄어듭니다.
- 명확한 흐름: 트랜잭션의 흐름이 명확하게 정의되어 있어 이해하기 쉽고 디버깅이 용이합니다.
- 일관성 유지: 중앙에서 트랜잭션을 제어하므로 데이터 일관성을 유지하기 쉽습니다.
단점
- 중앙 집중화: 중앙 조정자가 시스템의 병목이 될 수 있습니다.
- 단일 장애점: 오케스트레이터에 장애가 발생하면 전체 트랜잭션이 중단될 수 있습니다.
- 유연성 부족: 코레오그래피 기반 패턴보다 서비스 간의 결합도가 높아 변경에 유연하지 않을 수 있습니다.
사용 사례
오케스트레이션 기반 Saga 패턴은 복잡한 트랜잭션 흐름을 중앙에서 관리하고자 할 때 유용합니다. 특히, 트랜잭션 단계가 명확하게 정의되어 있고, 일관성을 유지하는 것이 중요한 시스템에서 효과적입니다. 그러나 중앙 조정자의 부하를 관리하고 장애에 대비한 설계가 필요합니다.
'MSA(마이크로서비스)' 카테고리의 다른 글
분산된 마이크로서비스에서 데이터 일관성을 보장하는 비법: SAGA 패턴 완벽 가이드 (0) | 2024.11.19 |
---|---|
실시간 비즈니스 혁신을 위한 이벤트 기반 아키텍처의 비밀 (0) | 2024.10.08 |
마이크로서비스의 핵심! Service Discovery로 유연하고 확장 가능한 아키텍처 만들기 (0) | 2024.10.04 |
시스템 효율을 극대화하는 8가지 로드 밸런싱 알고리즘의 비밀 (0) | 2024.09.27 |
이벤트 기반 마이크로서비스 아키텍처: 더 나은 확장성과 유연성을 위한 해법 (0) | 2024.09.06 |