포스트

08.트랜잭션

MSA Transaction

방법1. Two Phase Commit

  • Two Phase Commit 방식에서는 Transaction Coordinator가 각 서비스의 Commit. Rollback을 제어하는 형태로 트랜잭션을 관리한다

  • 위의 그림을 예시로 고객이 결재를 완료했을 경우
    1. 재고관리 서비스에서는 재고를 차감한다
    2. 배송 서비스에서는 배송정보를 생성한다
    3. 주문정보의 상태를 발송으로 변경한다

  • 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

  • SAGA 패턴은 크게 Choreography, Orchestration 두 개로 구분된다

  • Choreography-based SAGA는 위와 같이 재고 차감이 완료되면 배송서비스에 이벤트를 전달하고,
  • 배송서비스에서 배송정보를 생성 후, 주문 서비스에 이벤트를 전달하여 주문정보를 변경하는 순차적으로 이벤트가 전달되면서 트랜잭션이 관리되는 방식이다
  • 만일 오류가 발생하면, 다시 역순으로 복원 이벤트들이 발생하는 방법을 취한다.

  • Orchestration-based SAGA는 SAGA Orchestrator에서 각 서비스에게 호출하여 트랜잭션을 관리하는 방식
    1. 주문 서비스가 주문을 저장하고, SAGA Orchestrator에게 트랜잭션을 시작하도록 요청한다
    2. Orchestrator는 지불 명령을 Payment 서비스로 보내고, 지불 완료 메세지로 응답한다
    3. Orchestrator는 주문 준비 명령을 Order 서비스로 보내고, 주문 준비 메세지로 응답한다
    4. Orchestrator는 배달 명령을 Delivery 서비스로 보내고, 주문 배달 메세지로 응답한다
    5. 모든 응답이 완료되면 트랜잭션을 종료한다.

  • 에러 발생시
    1. Stock 서비스에서 품절 메세지를 Orchestrator에 전달한다
    2. Orchestrator에서 롤백을 시작한다
    3. Orchestrator는 환불 명령을 Payment 서비스로 보내고, 주문실패 상태로 변경한다.

  • Orchestration-based SAGA는 트랜잭션을 Orchestrator가 집중해서 관리할 수 있다
  • 따라서 복잡도가 줄어들어 롤백을 쉽게 관리할 수 있고, 구현 및 테스트가 용이하다
  • 그러나 Orchestrator에 모든 트랜잭션이 집중되어 로직이 복잡해 질 수 있고, Orchestrator 추가로 인한 인프라도 고려해야 한다.
참고 사이트

용감한 남매들-MSA Transaction