사가는 여러 단계의 로컬 트랜잭션으로 구성된 비즈니스 프로세스다. 각 로컬 트랜잭션은 특정 서비스내에서 원자적으로 수행된다.
이 흐름의 각 단계는 서로 다른 서비스에서 수행할 수 있는 작업을 나타낸다. 각 서비스 내부의 모든 상태 변경은 로컬 ACID 트랜잭션 내에서 처리될 수 있다.
사가를 통해 기술적인 실패가 아닌 비즈니스 실패로부터 복구할 수 있다는 점을 기억하자. 예를 들어, 고객이 결제를 시도했지만 고객의 자금이 부족하다면, 사가가 처리해야 하는 비즈니스 실패다. 반면에 결제 게이트웨이가 타임아웃이 되거나 500 에러를 발생시키면, 별도로 처리해야 하는 기술적 실패다. 사가는 기반 구성 요소가 제대로 동작하고 있다고 가정한다.
이 모든 단계가 단일 데이터베이스 트랜잭션에서 수행된 경우라면, 간단한 롤백으로 모든 처리 과정을 정리할 수 있다. 그러나 주문 처리 프로세스의 각 단계는 다양한 트랜잭션 범위에서 운영되는 각 서비스 요청으로 처리됐다. 전체 작업을 한 번에 되돌릴 간단한 '롤백'은 없다. 롤백 구현을 원한다면 보상 트랜잭션을 구현해야 한다. 보상 트랜잭션은 이전에 커밋된 트랜잭션을 취소하는 연산이다. 사가 패턴을 적용한 상황에서는 이미 트랜잭션이 발생했으므로, 시간을 롤백해 원래 트랜잭션이 전혀 일어나지 않은 것처럼 만들 수는 없다.
트랜잭션을 항상 깔끔하게 되돌릴 수는 없으므로 이런 보상 트랜잭션을 이른바 의미적 롤백이라고도 한다.
워크플로의 단계를 재정렬해 롤백 가능성이 있는 시나리오를 다소 간단하게 만들 수 있다. 실패할 가능성이 가장 높은 단계를 앞으로 당기고 해당 프로세스를 더 일찍 실패하면, 해당 단계는 애초에 수행되지도 않았으므로 나중에 보상 트랜잭션을 할필요가 없다.
'기타' 카테고리의 다른 글
[MSA] 도메인 주도 설계(Domain-Driven Design - DDD) (0) | 2025.05.05 |
---|---|
[MSA] 사가 구현: 오케스트레이션 vs 코레오그래피 (0) | 2025.05.01 |
3-Way Handshake & 4-Way Handshake (0) | 2025.05.01 |
(Synchronous || Asynchronous) || (Blocking || Non-Blocking) (0) | 2025.05.01 |
지식이 값싼 시대 (0) | 2025.04.30 |
댓글