PSD( Private-Self-Development )

사가 패턴(SAGA Pattern) 본문

Backend/MSA

사가 패턴(SAGA Pattern)

chjysm 2024. 5. 12. 13:59

수업을 다 듣고 나서

MSA 간 데이터 동기화 프로레스 중 에러가 발생한 경우 (트랜젝션 처리가 필요) 의 처리에 대해 

궁금하여 공부해 보았다.

 

사가 패턴??

MSA 서비스 간, 이벤트를 주고 받아 특정 MS에서 작업이 실패하면

이전 MS들에게 보상 트랜젝션을 발생 시켜 롤백 처리를 진행하여 원자성을 보장하는 것

이전에 DB에서 트랜젝션을 관리하는것과는 달리, application 에서 관리한다.

 

사가 패턴의 종류 

Choreography based SAGA pattern

각자의 MSA 들이 각자의 보상 트랜젝션을 가지고

실패한 경우, 이전 MS 에 보상 트랜젝션을 발생 시키고,
이전 MS 에서는 그 이전 MS 의 보상 트랜젝션을 발생 시키는 것

 

EX)

A -> B -> C 순차적 진행중 C 에서 문제 발생 시,

C -> B -> A 순으로 보상 트랜젝션 이벤트 발생( MQ를 이용하여 비동기 발생 )

 

장점

  • 구성하기 편하다

단점

  • 트랜잭션의 현재 상태를 확인하기 어렵다.

 

Orchestration based SAGA pattern

이벤트 발생의 주체가 되는 MS 에서 SAGA 인스턴스(Manager)를 구현하여,

트랜젝션에 관여하는 모든 App은 Manager에 의해 순차적으로 트랜젝션을 수행하고 결과를 Manager에게 전달하고

중간에 실패하면 역순으로 Manager 가 MS들에게 보상트랜젝션 발생시킨다.

 

장점

  • 서비스간 복잡성이 줄어들고 구현 및 테스트가 쉬워진다.
  • 트랜젝션의 현재 상태를 Manager가 알고 있다.

단점

  • 관리를 해야하는 Orchestrator 서비스가 추가되어야하기 때문에 인프라 구현이 복잡

 

구현

public interface SagaStep {
    void execute(); // 트랜잭션 실행
    void compensate(); // 보상 로직 실행
}
public class SagaOrchestrator {
    private List<SagaStep> steps;

    public SagaOrchestrator() {
        this.steps = new ArrayList<>();
    }

    public void addStep(SagaStep step) {
        steps.add(step);
    }

    public void execute() {
        for (int i = 0; i < steps.size(); i++) {
            try {
                steps.get(i).execute();
            } catch (Exception e) {
                rollback(i);
                throw e;
            }
        }
    }

    private void rollback(int tillIndex) {
        for (int i = tillIndex; i >= 0; i--) {
            try {
                steps.get(i).compensate();
            } catch (Exception e) {
                // 롤백 실패 로깅
                System.err.println(“롤백 실패: ” + e.getMessage());
            }
        }
    }
}

 

public static void main(String[] args) {
    SagaOrchestrator orchestrator = new SagaOrchestrator();

    orchestrator.addStep(new SagaStep() {
        @Override
        public void execute() {
            // 데이터 복제 실행 로직
            System.out.println(“사용자 데이터 서비스 A에 복제“);
        }

        @Override
        public void compensate() {
            // 데이터 복제 롤백 로직
            System.out.println(“서비스 A에 복제된 사용자 데이터 롤백“);
        }
    });

    // 추가적인 복제 단계는 여기에 구현

    try {
        orchestrator.execute();
    } catch (Exception e) {
        System.err.println(“사가 실행 중 에러 발생: ” + e.getMessage());
    }
}

 

 

 

 


참조

https://azderica.github.io/01-architecture-msa/

 

[Architecture] MSA : SAGA 패턴이란 - Azderica

[Architecture] MSA : SAGA 패턴이란 Posted 22. December 2020. 7 min read. MSA : SAGA 패턴의 정의과 종류 이전에 MSA 개념에 대해 잡아보았습니다. 오늘은 MSA를 듣다보면 꼭 듣게 되는 SAGA 패턴에 대해 공부해보겠

azderica.github.io

 

'Backend > MSA' 카테고리의 다른 글

MSA 간 API 조회 최적화  (0) 2024.05.12
MSA 모니터링  (0) 2024.04.29
MSA 장애 처리 및 분산 추적  (0) 2024.04.23
Kafka( 카프카 )  (0) 2024.04.22
Feign Client  (1) 2024.04.19