O0oO0Oo / netty-reservation-service

트랜잭션, 동시성을 공부하기 위한 토이 프로젝트입니다.
0 stars 0 forks source link

feat: impl saga pattern #11

Closed O0oO0Oo closed 1 month ago

O0oO0Oo commented 2 months ago

이슈 개요

사가 패턴을 구현하기 위해 필요 구성요소, 구조 공부, 구현

재현 단계

문서

구현

예상 동작

  1. 예약 요청이 들어오면 이벤트를 생산하고 각 서비스에서 소비해간다.
  2. 예외가 발생하면 이전에 있던 Compensatable 트랜잭션들이 보상 트랜잭션을 사용하여 롤백된다.
  3. Pivot 트랜잭션까지 진행된다면 이후의 트랜잭션들은 어떠한 예외가 발생하여도 재시도를 한다.

실제 동작

  1. SagaCoordinator 에 시작을 요청
  2. 등록한 SagaDefinition 을 통해 Netty 의 Promise 체인을 생성, 배열로 리턴 (아래의 예시)
    
    1, 2 번 SagaPromise 가 완료되면 4번이 execute 된다.
    2, 3 번 SagaPromise 가 완료되면 5, 6번이 execute 된다.
                     +---> [1] ---+
                     |            |---> [4 (depends on 1,2)] ---+
    [init promise] ---> +---> [2] ---+                             |---+
                     |            |---> [5 (depends on 2,3)] ---+   |
                     +---> [3] ---+                                 +---> [7]
                                  |                                 |
                                  +---> [6 (depends on 3)] ---------+
    
    
  3. SagaDefinition 에서 받은 정보를 SagaCoordinator 가 SagaStateManger 를 통해 상태를 저장
  4. 응답이 오면 위의 그림처럼 각 단계를 success 한 상태로 설정하게 되고, 각 단계는 이전단계가 성공하면, 결과 값들을 가지고 다음 이벤트를 발행.

추가 정보