보상 트랜잭션이란?
MSA에서 보상 트랜잭션은 분산 시스템에서 여러 서비스 간의 데이터 일관성을 유지하기 위한 기법이다.
일반적으로 MSA는 각 서비스가 독립적으로 배포되고 운영될 수 있도록 설계되어 있기 때문에, 하나의 서비스에서 트랜잭션이 발생하더라도 다른 서비스에는 영향을 미치지 않는 경우가 많다.
이로 인해 데이터 일관성을 유지하기 위한 방법이 필요하다. 보상 트랜잭션은 이런 요구를 해결하기 위한 방법이다.
정의
- 보상 트랜잭션은 이전에 수행된 트랜잭션의 영향을 취소하기 위해 실행되는 추가적인 트랜잭션이다.
- 원래 트랜잭션이 실패하거나, 후속 프로세스에서 롤백이 필요할 때 사용된다.
사용 상황
- MSA 환경에서 여러 서비스가 순차적으로 호출되는 과정에서 하나의 서비스에서 오류가 발생했을 때, 이미 성공한 서비스의 작업을 취소하거나 보상해야할 때 사용한다.
구현 방식
사전에 정의된 보상 트랜잭션
- 각 서비스는 명시적으로 보상 트랜잭션을 정의해야 하며, 성공적으로 수행되도록 구현해야 된다.
오케스트레이션
- 보상 트랜잭션을 관리하기 위해 오케스트레이터를 사용할 수 있다. 오케스트레이터는 각 서비스의 상태를 추적하고, 필요할 때 보상 트랜잭션을 호출한다.
상태 관리
- 각 서비스는 자신의 상태를 관리해야 하며, 성공적인 트랜잭션과 보상 트랜잭션의 실행 여부를 명확하게 정의해야 한다.
장단점
장점
- 데이터 일관성 유지 : 여러 서비스 간의 데이터 일관성을 효과적으로 유지할 수 있다.
- 비즈니스 로직 반영 : 실제 비즈니스 프로세스에 맞춘 복잡한 트랜잭션 처리가 가능하다.
단점
- 복잡성 증가 : 보상 트랜잭션을 구현하는 데 있어 복잡성이 증가
- 성능 문제 : 보상 트랜잭션이 추가적인 처리를 요구하므로 성능 저하가 발생할 수 있다.
SAGA
- MSA 환경에서 분산 트랜잭션을 관리하는 데 유용하게 사용된다.
- 여러 서비스 간의 트랜잭션을 관리하기 위해 각 서비스의 로컬 트랜잭션을 순차적으로 실행하고, 만약 중간에 실패가 발생하면 이를 보상하기 위해 이전 단계의 트랜잭션을 롤백하는 방식이다.
접근 방식
오케스트레이션
- 중앙 오케스트레이터가 모든 트랜잭션을 관리하고 조정한다. 트랜잭션이 순차적으로 진행되며, 오류 발생 시 보상 트랜잭션을 호출한다.
- ex) 주문 처리 -> 결제 -> 배송 요청 등이 순차적으로 실행되는 구조.
코레오그래피
- 각 서비스가 자신의 로컬 트랜잭션을 수행하고, 성공 여부에 따라 다음 서비스에 이벤트를 전파한다. 각 서비스는 이벤트를 수신하면 보상 트랜잭션을 정의하여 처리한다.
- ex) 주문 서비스가 결제 서비스에 이벤트를 발송하고, 결제 서비스가 성공적으로 처리하면 배송 서비스에 이벤트를 발송하는 구조
오케스트레이션은 로컬 트랜잭션의 실패 시 모든 연관된 트랜잭션을 명확하게 롤백하는 구조이며, 코레오그래피는 각 서비스가 독립적으로 보상 트랜잭션을 처리하여 롤백하는 구조이다.
이러한 차이로 인해 각 방식은 특정 비즈니스 요구 사항에 따라 적합하게 선택해야 한다.