개요
- Saga Pattern에 대해 알아본다
- Saga Pattern의 두 가지 방식 (Orchestration, Choreography)에 대해 알아본다
Saga?
- "Saga"라는 용어의 원래 의미는 오래된 북유럽 언어인 고대 노르웨이어와 아이슬란드어에서 비롯되었으며, "말하는 것"이나 "서술"을 의미하였음
- 분산 트랜잭션 처리 패턴으로 생겨난 Saga 패턴은 복잡한 트랜잭션을 시간에 걸쳐 이뤄지는 일련 조치를 적절하게 포착하기 위해 선택된 것
![](https://velog.velcdn.com/images/dobecom/post/adb0b081-2e37-4862-a530-fc16eaed7639/image.png)
Saga 패턴
- Saga는 전체 트랜잭션을 형성하는 일련의 로컬 트랜잭션
- 각 로컬 트랜잭션은 다른 마이크로서비스에서 수행될 수 있으며, 하나의 트랜잭션이 실패하면 Saga는 보상 작업을 실행하여 이전 트랜잭션을 롤백해야 함
Choreography 방식
- Choreography 방식은 각 마이크로서비스가 이벤트를 통해 다른 마이크로서비스와 통신하는 분산 방식으로 Saga를 구현하는 방법
- 장점
- 마이크로서비스 간의 결합도를 줄여 유지보수 용이
- 확장성, 가용성에 유리하며 유연한 구조로 변경이 쉬움
- 단점
- 복잡성과 테스트가 증가
- 가시성과 모니터링이 감소
- 보다 많은 조정과 일관성이 필요
- 마이크로서비스 간의 이벤트 스키마 및 의미론에 동의해야 함
- 중복되거나 순서가 바뀐 이벤트를 처리해야 함
- 느슨한 결합: 예를 들어, 결제 서비스는 주문 서비스의 내부 작업을 알 필요 없음
- 유연성: 새로운 서비스를 추가하는 것이 중앙 조정자를 조정할 필요 없이 원활하게 통합될 수 있음
- 분산 작업으로 인한 확장성: 각 주문 서비스가 독립적으로 수평 확장할 수 있기 때문에 더 많은 주문을 처리하는 것 용이
- 자율성: 예를 들어, 재고 마이크로서비스는 중앙 지시를 기다리지 않고 독립적으로 작동
- 유지보수 용이성: 서비스 중 하나의 로직을 업데이트해도 다른 곳에 영향을 미치지 않음
- 예시
![](https://velog.velcdn.com/images/dobecom/post/1810dc17-ccb3-48b9-81b4-534040d606e4/image.png)
1. 주문 서비스는 POST /orders 요청을 수신하고 PENDING 상태의 주문을 생성
2. 주문 생성 이벤트를 발생
3. 고객 서비스의 이벤트 핸들러가 결제 예약 시도
4. 결과를 나타내는 이벤트를 발생
5. 주문 서비스의 이벤트 핸들러가 주문을 승인하거나 거부
Orchestration 방식
- Orchestration 방식은 Saga를 구현하는 중앙 집중식 방식으로, 단일 마이크로서비스가 다른 마이크로서비스에게 로컬 트랜잭션을 수행하도록 명령하는 조정자 역할을 하는 것
- 조정자는 Saga의 로직과 순서를 알고 있으며 명령과 응답을 통해 다른 마이크로서비스와 통신
- 예시
![](https://velog.velcdn.com/images/dobecom/post/e003c26c-4b77-4d2c-8e48-f653d9da2d7d/image.png)
1. 주문 서비스는 POST /orders 요청을 수신하고 주문 생성 사가 오케스트레이터를 생성
2. Saga Orchestrator는 PENDING 상태의 주문을 생성
3. 고객 서비스에 결제 예약 명령을 전송
4. 고객 서비스는 결제를 예약 시도
5. 결과를 나타내는 응답 메시지를 전송
6. Saga Orchestrator는 주문을 승인하거나 거부
참고
https://www.linkedin.com/advice/1/how-do-you-choose-between-choreography-orchestration
https://microservices.io/patterns/data/saga.html