일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- rabbitmq 싱글톤
- 백준 1504 java
- 자바 1676
- 백준 2252 줄세우기
- kotiln const
- 백준 연결요소 자바
- 백준 특정한 최단 경로
- java 1509
- spring mongodb switch
- spring mongoTemplate
- java 팩토리얼 개수
- Java Call By Refernce
- 안정해시
- java 백준 1509
- 전략 패턴이란
- kotiln functional interface
- java 1238
- spring mongoTemplate switch
- javav 1676
- ipfs bean
- 익명 객체 @transactional
- spring mongodb
- java 파티
- 자바 백준 팩토리얼 개수
- nodejs rabbitmq
- kotiln const val
- Spring ipfs
- go
- ipfs singletone
- mongodb lookup
- Today
- Total
공부 흔적남기기
SAGA 패턴 간단 정리 본문
SAGA 패턴은 MSA와 같은 분산 서비스에서 하나의 트랜잭션으로 묶어서 연산을 수행하고 싶을 때 사용한다.
Event 기반이며 Kafka와 같은 Message Queue를 이용하여 Async하게 Event를 주고 받는다.
Sync로 동작하게 되면 특정 서비스의 장애나 대기로 인한 Data Lock, Transcation Context 소실 등 문제가 발생할 수 있고
각 서비스간 강결합이 생기게 되어 관리가 어려워진다.
SAGA Pattern은 각 서비스에서 다른 서비스의 성공/실패를 판단하지 않고 먼저 commit 하는데 그 이유는 위와 같이 Data Lock과 Transaction Context 소실 문제 때문이다. 다른 서비스가 실패 하게되면 보상 트랙재션을 통해서 RollBack 하게 된다.
이때 먼저 호출된 서비스에서 먼저 DataBase에 Commit하기 때문에 데이터의 일관성이 깨질 수 있다. 이러한 문제를 Eventually Cosistency라고 부른다.
근데 생각해보면 Transcation의 기본인 ACID 중 C가 일시적으로 꺠지는 문제가 있다.. 결과적으로는 C가 맞춰지므로 괜찮은 건가.
SAGA 패턴은
2Phase의 Coordinator의 한계를 해결하기위해 재시도를 위한 Message Queue 그리고 긴 Data lock을 해결하기 위한 분산 트랙잭션을 사용한다.
참고로 2Phase commit은 prepare 단계와 commit 단계로 모든 서비스로 부터 prepare 응답이와야 commit하는 방식이다.
서비스가 작고 트랜잭션의 범위가 크지 않다면 2Phase도 괜찮을 수 있을 것 같다. 단 Coordinator의 spof, 그리고 재시도 로직을 추가로 구현해야 할 것이다.
제일 중요한 것은 분산트랙젝션은 구현, 관리가 굉장히 복잡하기 때문에 최대한 어떤 기교, 꼼수를 쓰더라도 분산트랜잭션을 사용하지 않도록 구현하는게 중요하다. 진짜 어쩔수 없을 때만 사용하자.
'MSA & Arcitecture' 카테고리의 다른 글
org.axonframework.commandhandling.CommandExecutionException(OUT_OF_RANGE: [AXONIQ-2000] Invalid sequence number 0 for aggregate expected 1) (0) | 2025.02.26 |
---|---|
EDA 간단정리 (0) | 2025.02.24 |
Kafka Topic 설정시 고민해보아야 할 것들 (0) | 2025.02.20 |
헥사고날 아키텍쳐에 대한 고찰? (0) | 2025.02.17 |
MSA란 -마틴 파울러 아티클 읽기 (0) | 2025.02.05 |