티스토리 뷰
마이크로서비스 아키텍처에서는 각 서비스가 독립된 DB를 가지기 때문에 기존의 단일 트랜잭션(@Transactional)으로 여러 DB에 걸쳐 원자성을 보장하기가 어렵다. 이를 해결하기 위해 다음과 같은 방식을 사용한다.
1. SAGA 패턴
SAGA 패턴은 마이크로서비스 간 분산 트랜잭션을 처리할 때 사용되는 패턴으로 각 서비스가 트랜잭션을 순차적으로 실행하고, 중간에 실패가 발생하면 보상 트랜잭션(Compensation Transaction)을 수행하는 구조이다.
위 그림은 SAGA 패턴의 흐름을 간단하게 보여준다.
1. Order Service
주문 요청을 처리하고 DB에 주문 정보를 저장한 뒤, Payment Service로 결제를 요청한다.
2. Payment Service
결제 승인 처리르 하고 성공하면 다음 단계인 Inventory Service로 넘어간다.
실패하면 Order Service에 보상 트랜잭션(주문 취소 등)을 요청한다.
3. Inventory Service
재고 차감을 수행하고 성공하면 전체 트랜잭션이 완료된다.
만약 실패하면 Payment Service와 Order Service에 각각 보상 트랜잭션을 수행시킨다. (예: 결제 취소, 주문 취소)
4. Compensation Action
실패 시 수행되는 각 서비스의 보상 로직을 의미한다. 예를 들어, 주문 삭제, 결제 취소, 재고 복구 등이 이에 해당한다.
SAGA는 전체 트랜잭션을 하나로 묶는 것이 아니라, 각 서비스가 자신의 트랜잭션을 책임지고 처리한다.
문제가 생겼을 경우에는 이전 단계의 결과를 취소하는 보상 방식으로 일관성을 유지한다.
대표적으로 이벤트 기반 (Saga Choreography) 또는 중앙 컨트롤러 기반 (Saga Orchestration) 으로 구현한다.
2. Two-Phase Commit (2PC)
2PC (Two-Phase Commit) 는 여러 시스템(또는 DB) 간에 트랜잭션을 원자적으로 (commit or rollback) 처리하기 위한 분산 트랜잭션 관리 기법이다.
동작 흐름
준비단계 (Prepare Phase)
트랜잭션 관리자 (Transaction Coordinator) 가 참여자 (각 DB나 서비스) 에게 "커밋할 준비 되었는가?"를 묻는 메시지를 보낸다.
각 참여자는 자신의 트랜잭션을 준비한 뒤, YES 또는 NO로 응답함
커밋단계 (Commit Phase)
모든 참여자가 YES를 응답하면 트랜잭션 관리자가 커밋 명령을 내려 트랜잭션을 완료
누군가 NO를 응답하면 모든 참여자에게 롤백 명령을 내려 이전 작업을 취소
장점
- 강한 일관성 (Strong Consistency)을 보장함
- 트랜잭션이 여러 시스템에 걸쳐 있어도 원자성 유지 가능
단점
- 트랜잭션 잠금 시간이 길어져 성능 저하 발생
- 네트워크 장애 발생 시 트랜잭션이 중단된 상태로 블로킹될 수 있음.
- MSA에서는 확장성과 성능 문제로 잘 사용하지 않음
- Total
- Today
- Yesterday
- /tmp/mongodb-27017.sock
- No space left on device
- tomcat
- Apache
- 몽고DB
- Failed to unlink socket file
- port
- X-Forwarded-For
- ssh
- logrotate
- docker
- denied
- fail2ban
- catalina.out
- Permission
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |