Saga Pattern

개발자·2022년 12월 19일
0

MSA

목록 보기
7/7

MSA 환경에서는 트랜잭션을 분산 환경에서 처리해야한다. 따라서 서비스 간 데이터 일관성을 유지하기 위해 트랜잭션 관리 전략이 필요하다. Saga Pattern은 이러한 전략중 하나이다.

Saga Pattern

분산 환경에서 트랜잭션을 구현하는 방법으로 마이크로서비스들끼리 이벤트를 주고 받아 특정 마이크로서비스에서의 작업이 실패하면 이전까지의 작업이 완료된 마이크서비스들에게 보상 이벤트를 소싱함으로써 분산 환경에서 원자성(Atomicity)을 보장하는 패턴이다. 실패시 처리하는 보상 트랜잭션을 설계해야 한다.

  • 보상 트랜잭션 : 이전에 커밋 된 트랜잭션을 취소하는 작업

구현 방법

1. Choreographed Saga

운영에 대한 책임을 서비스에 분산시키는 방식이다. 느슨하게 결합된 모델을 선호하는 경우 적용할 수 있지만, 비즈니스를 이해하고 적용해야 하므로 높은 개발 난이도를 요구하며, saga의 진행 과정을 더 복잡하게 만들 수 있다.

각 서비스가 Local 트랜잭션을 관리하며 트랜잭션이 종료하게 되면 완료 이벤트를 발행한다. 만약 그 다음 수행해야할 트랜잭션이 있으면 이벤트를 보내고, 해당 서비스는 완료 이벤트를 수신받아 다음 작업을 진행한다. 이때 이벤트는 Kafka와 같은 메시지 큐를 통해서 비동기 방식으로 전달할 수 있다.

실패시 각 서비스가 보상 트랜잭션을 결정하고 처리한다. 수신되는 이벤트에 따라 조치를 취하는 방식이다. 이벤트는 요청자 또는 서비스로부터 송신되며, 이를 구독하는 또 다른 서비스가 수신하는 방식이다. 즉 이벤트를 서비스에 직접 보내는 것이 아니라 이벤트에 관심 있는 서비스가 이벤트를 수신하고 그에 따라 조치를 취하는 방식이다. 여러 서비스가 동일한 이벤트에 반응할 수 있다.

Publishing 한 서비스가 누구인지 알 필요 없이 특정 이벤트가 수신되었을 때 무엇을 해야 하는지만 알면된다. 이것은 서비스간 결합도를 낮춘다. 하지만 서비스 간 결합도가 낮아짐에 따라 추적이 어려워질 수 있다.

2. Orchestrated Saga

트랜잭션 처리를 위해 중앙에서 관리하는 Saga 인스턴스가 별도로 존재한다. 중앙 오케스트레이터는 모든 트랜잭션을 처리하고 이벤트에 따라 수행할 작업을 참가자에게 알려준다. 또한, Saga 요청을 실행하고, 각 작업의 상태를 저장 및 해석하며, 보상 트랜잭션을 사용하여 오류 복구를 처리한다. 보상 트랜잭션을 관리하는 중앙집중식 방식으로 개발 부담을 덜 수 있지만, 결합도가 올라간다. 

실행 순서를 정의하고 필요한 보상 작업을 트리거하기위해 중앙 오케스트레이터를 사용한다. 중앙 오케스트레이터는 어떤 일이 언제 발생하는지 제어하며, 이를 통해 주어진 saga에서 어떤 일이 일어나고 있는지에 대한 가시성을 확보할 수 있다. 즉 중앙 오케스트레이터가 보상 트랜잭션을 처리한다.

복구 방법

1. Backward Recovery

트랜잭션 실패시 롤백을 처리하는 방식이다. 각 서비스의 트랜잭션을 일괄 롤백으로 처리할 수 없으므로 이전에 커밋된 트랜잭션을 취소할 수 있는 보상 트랜잭션을 정의해야 한다.
이러한 보상 트랜잭션은 커밋 후에 롤백을 정의하므로 완전히 처음과 동일한 상태로 돌아기지 못하는 경우도 발생한다. 이와 같은 이유로 보상거래를 의미론적 롤백이라고도 한다.
롤백을 구현하며 기존 비즈니스를 개선하여 처리할 수도 있다.(ex. 실패시 사용자에게 push 알림)

2. Forward Recovery

forward recovery는 장애가 발생한 지점에서 중지하지 않고 계속 처리하는 방식이다(재시도).
실패가 발생한 시점에 즉시 복구가 중요하지 않은 서비스이거나, 실패한 내용이 성공한 부분보다 굉장히 사소한 부분일 경우 등 보상 트랜잭션을 구성하지 않고도 실패에 대해 알림을 주고, 그 경우가 클라이언트 입장에서 허용될 수 있을 경우에 Forward Recovery를 적용할 수 있다.

결론

Choreographed Saga는 대규모 프로젝트에서 각 팀간의 결합도를 낮추고 개발에 영향을 최소화 하기 위해 선택하기 용이하다. 반면에 Orchestrated Saga는 단일 팀 내에서 개발 가능한 경우 중앙 관리 방식으로 개발하는 것이 효과적이다.
참고로 MSA에서 조금 더 적합한 방식은 Choreographed 방식이다.



Ref.

https://waspro.tistory.com/735?category=857035
https://azderica.github.io/01-architecture-msa/
https://learn.microsoft.com/ko-kr/azure/architecture/reference-architectures/saga/saga
https://oyg0420.tistory.com/entry/Saga%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

profile
log.info("공부 기록 블로9")

0개의 댓글