728x90
2PC (Two Phase Commit)
- 분산 시스템에서 트랜잭션을 변경할 수 있는 기능을 제공하는 방식
- Transaction Coordinator가 각 서비스의 Commit. Rollback 을 제어하는 형태로 트랜잭션을 관리함
- 2PC는 서비스가 증가할수록 시스템의 대기 시간이 길어지며, 이는 응답시간의 증가를 초래함
- Lock을 잡아야 하는 Row의 범위가 크거나 트랜잭션 기간이 긴 경우 시스템에 엄청난 대기시간을 발생하므로 수명이 매우 짧은 작업에만 사용하는 것을 권장
- 마이크로서비스 전체에서 상태 변경을 조정하기 위해 2PC와 같은 분산 트랜잭션을 사용하지 않는 것이 좋음
- 2PC는 결국 Coordinator를 기반으로 강력한 결합을 유도하고, 데이터에 직접적인 Lock을 잡고 처리하기 때문에 서비스간 영향도와 궁극적으로 성능에 영향을 줄 수 있기 때문
- DB 트랜잭션을 사용하기 때문에 트랜잭션 교착상태가 발생할 수 있다는 단점이 있음
쇼핑몰을 예시로 들면 고객이 결재를 완료 했을 경우
1. 재고관리서비스에서는 재고를 차감합니다.
2. 배송 서비스에서는 배송정보를 생성합니다.
3. 주문정보의 상태를 발송으로 변경합니다.
1. Prepare
Two Phase Commit 방식에서는 우선 각 데이터 Prepare 상태로 처리 합니다.
각 서비스에서 처리가 완료 되었을 경우 Transaction Coordinator에 Commit 준비 완료 메세지를 보냅니다.
3. Commit
Commit 준비가 완료되면 각 서비스에서 Comit을 진행합니다.
4. Error
만일 위와 같이 배송정보 생성 중 오류가 발생할 경우 Transaction Coordinator 실패 메세지를 보냅니다.
5. Rollback
Transaction Coordinator에서 각 서비스에 Rollback 하도록 지시합니다.
Two Phase Commit의 경우 NoSQL에서는 지원을 하지 않으며, 교착상태가 발생할 우려가 있습니다.
Saga
- Long Lived Transactions
- SAGA 패턴은 크게 Choreography, Orchestration 두 개로 구분
Choreography Saga
- 순차적으로 이벤트가 전달되면서 트랜잭션이 관리되는 방식
- 느슨하게 결합된 모델을 선호하는 경우 적용
- 이벤트는 RabbitMQ, Kafka와 같은 메시지 큐 미들웨어를 사용해서 비동기 방식 혹은 분산 처리 형태로 전달할 수 있음
- 비즈니스를 이해하고 적용할 수 있도록 높은 개발 난이도를 요구하며, saga의 진행 과정을 더 복잡하게 만들 수 있음
Choreography-based SAGA는 위와 같이 재고 차감이 완료되면 배송서비스에 이벤트를 전달하여,
배송서비스에서 배송정보를 생성 후, 주문서비스에 이벤트를 전달하여 주문정보를 변경하는
순차적으로 이벤트가 전달되면서 트랙잭션이 관리되는 방식입니다.
만일 위와 같이 배송정보 생성 중 오류가 발생할 경우, 배송에서는 재고관리 서비스로
재고 복원 이벤트를 전달하게 되며, 재고 복원이 만료되면 결재서비스로 결재 취소 이벤트를 전달하여
결재가 취소되는 방식으로 관리됩니다.
Orchestration Saga
- SAGA Orchestrator에서 각 서비스를 호출하여 트랜잭션을 관리하는 방식
- 주로 중앙에서 관리하는 프레임워크 또는 미들웨어를 통해 통제되는 방식
- 상트랜잭션을 관리하는 중앙집중식 방식으로 개발 부담을 덜 수 있지만, 결합도가 올라감
- 트랜잭션을 Orchestrator 집중해서 관리 할 수 있으므로,복잡도가 줄어들어 롤백을 쉽게 관리할수 있고, 구현 및 테스트가 용이
- Orchestrator에 모든 트랙잭션이 집중되어 로직이 복잡해 질 수 있고,Orchestrator 추가로 인한 인프라도 고려해야 함
1. 주문 서비스가 주문을 저장을 하고, SAGA Orchestrator 에게 트랜잭션을 시작하도록 요청합니다.
2. Orchestrator는 결제 명령을 Payment 서비스로 보내고, 결제 완료 메세지로 응답합니다.
3. Orchestrator는 주문 준비 명령을 Order 서비스로 보내고, 주문 준비 메세지로 응답합니다.
4. Orchestrator는 배달 명령을 Delivery 서비스로 보내고, 주문 배달 메세지로 응답합니다.
5. 모든 응답이 완료되면 트랜잭션을 종료합니다.
롤백 과정
1. Stock 서비스에서 재고부족으로 인한 주문 취소 품절 메세지를 Orchestrator에 전달합니다.
2. Orchestrator에서 롤백을 시작, 보상 트랜잭션으로 환불 명령을 결제 서비스로 보내고 환불 완료 메시지를 응답받는다.
3. Orchestrator는 환불 명령을 Payment 서비스로 보내고, 주문실패 상태로 변경합니다.
728x90