Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 멀티스레드
- Transaction Pattern
- 스레드
- zipkin
- 배치
- 스프링 배치
- saga pattern
- spring cloud
- 체인 패턴
- 타입스크립트
- thread
- Java
- 디자인패턴
- 생산자 소비자 패턴
- 키클락
- JPA
- Resilinece4j
- Parallel Old GC
- The law of Demeter
- MSA
- Spring Boot Actuator
- spring batch
- 디자인 패턴
- java 정렬
- 알고리즘
- 사가 패턴
- Action Pattern
- TypeScript
- Serial GC
- Spring Cloud Netfilx Eureka
Archives
- Today
- Total
PSD( Private-Self-Development )
사가 패턴(SAGA Pattern) 본문
수업을 다 듣고 나서
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/
'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 |