Architecture Pattern

Saga 패턴 이란 ?

Ed2024 2024. 11. 7. 00:31

Saga 패턴은 1987년에 Hector Garcia-Molina Kenneth Salem이 발표했습니다. 이들은 논문 "Sagas"를 통해, 긴 트랜잭션을 효율적으로 처리하기 위한 방법으로 Saga 패턴을 제안했습니다. 이 패턴은 주로 분산 시스템의 트랜잭션 관리에서 사용되며, 트랜잭션을 여러 개의 작은 작업으로 나누고, 실패 시 이를 복구할 수 있는 보상 동작을 사용해 시스템의 일관성을 유지하는 방법을 설명합니다.

 

Garcia-Molina Salem의 연구는 데이터베이스 및 분산 시스템의 안정성을 확보하는 방안으로 큰 영향을 미쳤으며, 이후 마이크로서비스 아키텍처가 대두되면서 Saga 패턴이 더욱 주목받게 되었습니다.

 

SAGA 패턴이란 마이크로서비스들끼리 이벤트를 주고 받아 특정 마이크로서비스에서의 작업이 실패하면 이전까지의  작업이 완료된 마이크서비스들에게 보상 (complemetary) 이벤트를 소싱함으로써 분산 환경에서 원자성(atomicity)을 보장하는 패턴입니다.

 

1. Saga 패턴의 동작 방식

1) 분할된 트랜잭션 : Saga 패턴은 전체 트랜잭션을 여러 단계로 나누고, 각 단계를 독립적인 작업으로 수행합니다.

2) 상태 저장 및 보상 작업 : 각 단계가 완료될 때 상태가 저장되며, 만약 실패 시 이를 되돌리기 위한 보상 작업을   수행하여 일관성을 유지합니다.

이를 그림으로 표현하면 다음과 같습니다. SAGA 패턴의 이벤트 성공 시 다음과 같이 동작합니다.

SAGA 패턴의 이벤트 성공시 동작

 

SAGA 패턴의 핵심은 트랜잭션의 관리주체가 DBMS에 있는 것이 아닌 Application에 있습니다. MicroService  분산되어 있을 때 각 MicroService 하위에 존재하는 DB local 트랜잭션만 담당합니다.

, 각각의 MicroService의 트랜잭션 요청의 실패로 인한 Rollback 처리(보상 트랜잭션) Application에서 구현 합니다.

이러한 과정을 통해서 순차적으로 트랜잭션이 처리되며, 마지막 트랜잭션이 끝났을 때 데이터가 완전히 영속되었음을 확인하고 종료합니다. 이 방법을 통해서 최종 일관성(Eventually Consistency)를 달성할 수 있습니다.

아래는 SAGA 패턴의 이벤트 실패 시 동작 예시 입니다.

SAGA 패턴의 이벤트 실패시 동작

2. SAGA 패턴 실행 방식

   1) 직렬 실행 (Choreography): 각 서비스가 이벤트를 주고받으며 스스로 트랜잭션을 관리하고 다음 작업을 호출

Choreography 방식

장점

  • 참여하는 Service수가 적고 coordination logic이 필요 없는 간단한 워크플로에 적합함
  • 추가 서비스 구현 및 유지 관리가 필요하지 않음
  • 책임이 Saga 참여 Service에 분산되므로 단일 장애 지점이 발생하지 않음

단점

  • 서비스 간 이벤트를 주고받기 때문에 사가 참여 Service 간에 순환 종속성이 발생할 위험이 있음
  • 모든 서비스가 트랜잭션을 시뮬레이션하기 위해 실행되어야 하기 때문에 통합 테스트가 어려움

 2) 조정 실행 (Orchestration) : 중앙에서 조정하는 서비스가 각 단계를 순서대로 실행하며 트랜잭션을 관리

Orchestration 방식

장점

  • 비교적 많은 서비스가 있는 복잡한 워크플로우에 적합
  • 오케스트레이터가 Saga 참여 Service에 일방적으로 의존하기 때문에 순환적 종속성이 없음

단점

  • 추가적인 설계 복잡성으로 인해 coordination logic을 구현해야 함
  • 오케스트레이터가 전체 워크플로를 관리하기 때문에 실패 지점(point of failure)가 하나 더 생김

3. Saga 패턴의 사례

사례 1 : 항공 예약 시스템

항공 예약 시스템을 예로 들어 보겠습니다. 항공권 예약에는 여러 서비스가 연관됩니다. 예를 들어, 항공권 예약, 호텔 예약, 차량 렌트 등을 하나의 트랜잭션으로 처리해야 하는 경우입니다. Saga 패턴을 적용하면 다음과 같이 진행됩니다.

   1) 항공권 예약 서비스가 호출됩니다.

   2) 예약이 성공하면, 호텔 예약 서비스로 이벤트를 전파하고, 호텔 예약이 이루어집니다.

   3) 호텔 예약이 성공하면 차량 렌트 서비스가 호출됩니다.

만약 어떤 단계에서 실패한다면, 이전에 완료된 작업에 대해 보상 작업이 실행됩니다. 예를 들어 차량 렌트 예약이 실패하면, 호텔 예약과 항공권 예약을 취소하는 보상 작업이 실행됩니다.

 

사례 2: 온라인 쇼핑몰의 주문 처리

고객이 주문을 완료하면, 재고 확인, 결제, 배송 준비 등의 여러 단계를 거쳐야 합니다. 이 과정에서 어느 한 단계라도 실패하면 전체 주문 프로세스가 취소되어야 합니다. Saga 패턴을 적용하면, 각 단계에서 작업이 완료될 때마다 다음 단계로 진행되고, 실패 시에는 이전 작업을 취소합니다.

   1) 고객 주문 접수가 완료되면, 재고 확인 서비스가 호출됩니다.

   2) 재고가 확인되면 결제 서비스가 호출되어 결제를 진행합니다.

   3) 결제가 완료되면 배송 준비가 시작됩니다.

만약 결제 단계에서 오류가 발생하면, 재고 확인 결과를 되돌려 재고를 다시 반환하는 작업이 수행됩니다.