SAGA 패턴이란?
: 분산 어플리케이션(Ex. MSA)의 일관성을 유지하고 여러 마이크로 서비스 간의 트랜잭션을 조정하여 데이터 일관성을 유지하는 데 도움이 되는 장애 관리 패턴이다.
기존의 모놀리식(Monolithic) 환경에서는 DBMS가 기본적으로 제공해주는 트랜잭션 기능을 통해서 데이터 Commit / Rollback을 통해서 일관성있게 관리되었다. 하지만, 점차 DB나 어플리케이션이 분산되면서 해당 트랜잭션 처리를 단일 DBMS에서 제공하는 기능으로는 해결할 수 없어졌다. 이에 따라, 데이터 일관성을 유지하는 데 도움을 주는 여러 패턴이 나왔다.
SAGA 패턴을 알기 전에 - Two-Phase Commit
Two-Phase Commit은 여러 서비스 간에 트랜잭션 처리 중 데이터 일관성(원자성)을 유지하기 위한 방법이다. 분산 트랜잭션에서 Commit이 발생하는 경우 아래와 같이 2단계를 거쳐 진행된다.
1) Prepare 단계
코디네이터(coordinator, 조정 프로세스)가 모든 참가자(트랜잭션 대상 프로세스들)들을 대상으로 지금 업데이트가 가능한 상태인지 질의하는 단계
- 모든 Node가 Yes 라고 응답하면, 코디네이터는 Phase2로 넘어가 commit 요청을 보내서 커밋이 수행되도록 함
- 어느 하나라도 No를 응답하면 코디네이터는 Phase2로 넘어가 모든 Node들에 abort 요청을 보냄 (Rollback)
2) Commit 단계
2PC의 단점
- 코디네이터에 오류가 발생하면 모든 트랜잭션이 코디네이터가 복구 될 때 까지 지연됨.
- 트랜잭션 실행 중 코디네이터에 문제가 생겨 응답을 받지 못하면 참가자 전체가 Blocking 됨.
SAGA 패턴 정의
2PC의 단점을 해결하기 위해 등장한 SAGA 패턴은 마이크로서비스들끼리 이벤트를 주고 받아 특정 마이크로서비스에서 작업이 실패하면 이전까지의 작업이 완료된 마이크로 서비스 들에게 보상(complemetary)이벤트를 소싱함으로써 분산 환경에서 원자성(atomicity)을 보장하는 패턴이다.
SAGA 패턴 동작 방식 - 성공
SAGA 패턴 동작 방식 - 실패
SAGA 패턴은 트랜잭션의 관리주체가 DBMS가 아닌 어플리케이션에 있다. 어플리케이션이 분산되어있을 때, 각 어플리케이션 하위에 존재하는 DB는 Local 트랜잭션 처리만 담당한다. 따라서, 어플리케이션에 대한 연속적인 트랜잭션 요청 및 실패할 경우에 Rollback 처리(보상 트랜잭션)를 어플리케이션에서 구현해야한다.
참고
'[IT] > MSA' 카테고리의 다른 글
[MSA] REST Web Service 성숙도 모델 (REST Maturity Model) (0) | 2022.05.09 |
---|---|
[MSA] CQRS 패턴 이해하기 (명령과 조회의 책임 분리) : 정의, 사용목적, 적용예제 (0) | 2022.04.04 |