08.트랜잭션
MSA Transaction
방법1. Two Phase Commit
- Two Phase Commit 방식에서는 Transaction Coordinator가 각 서비스의 Commit. Rollback을 제어하는 형태로 트랜잭션을 관리한다
- 위의 그림을 예시로 고객이 결재를 완료했을 경우
- 재고관리 서비스에서는 재고를 차감한다
- 배송 서비스에서는 배송정보를 생성한다
- 주문정보의 상태를 발송으로 변경한다
- Two Phase Commit 방식에서는 우선 각 데이터를 Prepare 상태로 처리한다.
- 각 서비스에서 처리가 완료 되었을 경우 Transaction Coordinator에 Commit 준비 완료 메시지를 보낸다
- Commit 준비가 완료되면 각 서비스에서 Commit을 진행한다
- 만약 배송 정보 생성 중 오류가 발생할 경우 Transaction Coordinator는 실패 메시지를 보낸다
- Transaction Coordinator에서 각 서비스에 Rollback 하도록 지시
- Two Phase Commit의 경우 NoSQL에서는 지원을 하지 않으며, 교착상태가 발생할 우려가 있다.
방법2. Choreography-based SAGA & Orchestration-based SAGA
- Choreography-based SAGA는 위와 같이 재고 차감이 완료되면 배송서비스에 이벤트를 전달하고,
- 배송서비스에서 배송정보를 생성 후, 주문 서비스에 이벤트를 전달하여 주문정보를 변경하는 순차적으로 이벤트가 전달되면서 트랜잭션이 관리되는 방식이다
- 만일 오류가 발생하면, 다시 역순으로 복원 이벤트들이 발생하는 방법을 취한다.
- Orchestration-based SAGA는 SAGA Orchestrator에서 각 서비스에게 호출하여 트랜잭션을 관리하는 방식
- 주문 서비스가 주문을 저장하고, SAGA Orchestrator에게 트랜잭션을 시작하도록 요청한다
- Orchestrator는 지불 명령을 Payment 서비스로 보내고, 지불 완료 메세지로 응답한다
- Orchestrator는 주문 준비 명령을 Order 서비스로 보내고, 주문 준비 메세지로 응답한다
- Orchestrator는 배달 명령을 Delivery 서비스로 보내고, 주문 배달 메세지로 응답한다
- 모든 응답이 완료되면 트랜잭션을 종료한다.
- 에러 발생시
- Stock 서비스에서 품절 메세지를 Orchestrator에 전달한다
- Orchestrator에서 롤백을 시작한다
- Orchestrator는 환불 명령을 Payment 서비스로 보내고, 주문실패 상태로 변경한다.
- Orchestration-based SAGA는 트랜잭션을 Orchestrator가 집중해서 관리할 수 있다
- 따라서 복잡도가 줄어들어 롤백을 쉽게 관리할 수 있고, 구현 및 테스트가 용이하다
- 그러나 Orchestrator에 모든 트랜잭션이 집중되어 로직이 복잡해 질 수 있고, Orchestrator 추가로 인한 인프라도 고려해야 한다.