단일 DB의 모놀리식 애플리케이션의 트랜잭션 관리는 어렵지 않다. 하지만 다중 DB, 다중 메시지 브로커를 사용하는 모놀리식 애플리케이션이나 자체 DB를 가진 여러 서비스로 구성된 마이크로서비스 아키텍처는 관리가 어렵다!
각 서비스 별로 로컬 트랜잭션이 각각 존재한다. 도중 하나가 에러 발생하면 변경분을 어떻게 롤백시킬 것 인가? -> 보상 트랜잭션
사가는 단계를 편성하는 로직으로 구성된다.
시스템 커맨드가 사가를 시작할 때 첫 번째 사가 참여자를 정해 로컬 트랜잭션 실행을 지시하고, 트랜잭션이 완료되면 그다음 사가 참여자를 호출하는 과정이 모든 단계가 실행될 때까지 반복된다.
중앙 편성자 없음, 사가 참여자가 서로 이벤트 구독
성공
실패
확실한 이벤트 기반 통신
두 가지 통신 이슈 고려해야 한다.
장점
단점
사가 참여자가 할 일을 알려주는 오케스트레이터 클래스를 정의한다.
사가 참여자가 작업을 마치고 응답 메시지를 오케스트레이터에 주면, 오케스트레이터는 응답 메시지를 처리한 후 다음 사가 단계를 어느 참여자가 수행할지 결정한다.
장점
단점
-> 가급적 오케스트레이션 방식 권장
사가의 한 트랜잭션이 커밋한 변경분을 다른 사가가 즉시 바라볼 수 있다는 문제 존재, 해당 문제는 아래 두 가지 문제가 발생할 수 있다.
*_PENDING
상태도 이상 현상을 예방하는 전략 중 하나, 현재 주문을 사가로 업데이트 중이니 그에 맞게 행동하라고 다른 사가에게 알리는 것?!
사가는 다음 세 가지 트랜잭션으로 구성된다.
보상 가능 트랜잭션이 생성/수정하는 레코드에 무조건 플래그 세팅, 플래그를 통해 락을 걸어 놓는다.
어떤 순서로도 실행 가능하게 설계
예시 뭔말이야 !
더티 읽기(업뎃안했는데 다른 사가가 읽음)로 인한 비즈니스 리스크를 최소화하기 위해 사가 단계의 순서 재조정
소실된 업데이트 방지, 레코드를 업데이트 하기 전에 값을 다시 읽어 변경되지 않았는지 확인
레코드에 수행한 작업을 하나하나 기록
예를 들어
이런 경우가 있다고 친다면, 취소 요청을 기록해두고 승인 요청이 온다면 승인 작업을 생략하는 것을 인지할 수 있다.
애플리케이션 차원에서 각 요청의 속성을 보고 사가를 쓸지, 분산 트랜잭션을 쓸지 판단
--> 분산 트랜잭션 알아볼것 ..