Saga 패턴
Saga 패턴
Saga 디자인 패턴은 마이크로 서비스 간의 트랙잭션을 조정하여 데이터 일관성을 보장하는 패턴이다. Saga 패턴은 마이크로서비스의 트랜잭션에 대한 이벤트를 게시하여 다음 마이크로서비스에 대한 트랜잭션을 트리거한다. 만약 단계 중 실패가 발생 시 이전 마이크로서비스에 롤백 이번트를 게시하여 트랜잭션을 롤백하도록 트리거한다.
Saga 패턴은 분산 트랜잭션에서 전체 트랜잭션이 성공적으로 완료되거나 개별 마이크로서비스에 오류가 발생할 경우 초기 상태로 롤백되도록 보장할 수 있다.
모든 마이크로서비스는 자체 데이터베이스를 가지고 있어 일관성을 유지하면서 트랜잭션을 관리할 수 있다. Saga 패턴 이러한 로컬 트랜잭션을 하나씩 순차적으로 호출하여 처리한다. 각 로컬 트랜잭션은 데이터베이스를 업데이트하고 다음 로컬 트랜잭션을 트리거하기 위해 이벤트를 게시해서 정합성을 맞춘다. 이 단계 중 하나에 실패하면 이전 마이크로서비스의 변경 사항을 롤백하고 데이터 일관성을 복원하는 보상 트랜잭션인 롤백 트랜잭션이 트리거된다. 즉 일관성 유지가 필요한 트랜잭션을 묶어서 처리하는 대신 로컬 트랜잭션을 하나씩 순차적으로 처리하고 이번트 게시하여 다음 로컬 트랜잭션을 처리한다.
Saga 패턴의 유형
Saga 패턴을 구현하는 방법에는 ‘choreography’와 ‘orchestration’이라는 두 가지 유형이 있다.
Choreography Saga Pattern
Choreography Saga Pattern은 publish-subscribe 원칙을 적용하여 트랜잭션을 조율하는 기능을 제공한다. 각 마이크로서비스는 자체 로컬 트랜잭션을 실행하고 메시지 브로커 시스템에 이벤트를 게시하여 다른 마이크로서비스에서 로컬 트랜잭션을 트리거한다.
아래 그림과 같이 Choreography Saga는 각자의 책임을 가지기 때문에 서비스 간의 결합도는 느슨하지만, 복잡도가 높다. 이 방법은 마이크로서비스 트랜잭션 단계가 너무 많지 않은 심플한 워크플로에 적합하다.
Orchestration Saga Pattern
Orchestration Saga는 트랜잭션을 중앙 집중식으로 관리한다. 중앙 집중식 컨트롤러 마이크로서비스는 마이크로서비스의 로컬 트랜잭션을 순차적으로 실행하도록 호출하고, 단게 중 하나에 실패하면 보상 트랜잭션으로 롤백 단계를 실행한다.
Orchestration Saga는 중앙 컴포넌트가 트랜잭션을 제어하므로 서비스 간의 복잡성은 줄어들지만, 서비스 간의 결합도가 높아진다. 이 방법은 많은 단계를 포함하는 복잡한 워크플로에 적합할 수 있지만 중앙 컴포넌트가 장애 발생시를 고려해야 한다.
보상 트랜잭션(Compensating Transaction)
SAGA 패턴을 사용하려면 보상 트랜잭션을 사용하여 오류 발생 시 각 마이크로서비스에서 변경한 내용을 취소할 수 있다. 이렇게 하면 전체 트랜잭션이 성공적으로 완료되거나 초기 상태로 롤백되도록 보장할 수 있다.
Reference