MSA 환경에서 고민해야되는 포인트는 도메인별로 분산된 DB를 가질때의 트랜잭션 관리다.
단일 DB에서 제공하는 트랜잭션을 활용할 수 없다보니 전체적인 데이터 일관성과 무결성을 보장하기 위한 고민이 필요하다.
이를 해결하기 위한 대표적인 방식인 2PC 프로토콜(2Phase Commit)과 Saga Pattern에 대해 알아보자.
2PC(2Phase Commit) 프로토콜
MSA 가 대중화 되기 이전에 분산 데이터베이스 환경에서 데이터 일관성을 만족시키기 위해 널리 사용되었던 프로토콜 중 하나다.
전체적인 흐름은 중간의 Coorinator가 2단계(준비, 커밋)로 나뉘어 두 노드(DBMS)에 커밋을 진행하는 방식이다.
1) 준비 단계(prepare phase)
첫 번째, 준비 단계에서는 Coorinator가 모든 노드(DBMS)에 트랜잭션 열어 Lock을 획득후 커밋 가능 여부를 응답한다.
2) 커밋 단계(commit phase)
두 번째, 커밋 단계에서는 모든 노드가 준비 완료될 경우 commit 요청을 전송하고, 만약 하나라도 준비 실패한다면 rollback 요청을 보냄으로써 두 노드간의 데이터 일관성을 보장한다.
2PC 단점
MSA 환경에서는 다음과 같은 단점들로 거의 사용되지 않는다.
- 모든 요청을 처리할 때까지 관련된 모든 DB에 Lock이 설정된다. 따라서, 지연 시간(Latency)가 증가할 수 있다.
- 만약 비즈니스가 복잡해져서 관련 DB가 늘어난다면 그에 비례해서 지연 시간이 길어질 수 있다.
- 서비스 간 강결합을 초래한다.
- MSA 구조를 도입하는 이유는 각 서비스 간의 결합을 줄이고 독립적인 서비스를 구축하기 위함이다.
- 하지만 2PC를 적용하면 Coodinator를 기반으로 서비스 간의 강력한 결합이 생기기 때문에 MSA 구조를 사용하는 의미가 퇴색될 수 있다.
- 만약 코디네이터에 장애가 발생하면…? 전체 트랜잭션이 불확실한 상태에 빠질 수 있다. 코디네이터가 복구될 때까지 참여자들은 Lock을 획득하고 있으므로 대기 상태가 된다.
- 제약사항이 존재한다.
- 사용하는 DBMS가 분산 트랜잭션을 지원해야 사용할 수 있으며, 같은 종류의 DBMS여야 한다.
- NoSQL 은 지원 X
- 모든 노드가 커밋 혹은 롤백을 완료할 때까지 기다려야 하기 때문에, 네트워크 지연이나 참여자 지연이 있을 경우 성능 저하로 이어질 수 있다.
Saga Pattern
MSA 와 같은 분산 환경에서 데이터 일관성을 보장하기 위해 등장한 패턴이다. 각 서비스는 각각의 데이터베이스로 로컬 트랜잭션을 가지며, 해당 서비스의 데이터를 업데이트후 관련된 메시지 또는 이벤트를 발행하여 다음 단계의 서비스들의 트랜잭션을 수행하는 방법이다. 만약 특정 서비스에서 수행 실패가 발생하면 데이터 정합성을 맞추기 위해 이전 트랜잭션에 대한 보상 트랜잭션이 수행된다. 즉, 2PC와는 다르게 데이터 일관성을 보장하는 주체가 DBMS가 아닌 애플리케이션이다.
Saga 패턴은 ‘코레오그래피 사가 패턴’과 ‘오케스트레이션 사가 패턴’으로 나뉘어진다.
코레오그래피 사가 패턴(Choreography Saga Pattern)
중앙 제어 없이, 서비스끼리 이벤트 Pub/Sub을 활용해서 통신하는 패턴이다.
커머스 시스템의 주문 생성 시나리오를 통해 살펴보자.
- Order 마이크로서비스는 Pending 상태의 주문을 생성한다.
- Order 마이크로서비스는 주문 생성 이벤트를 발행한다.
- Stock 마이크로서비스는 주문 생성 이벤트를 컨슘하여 재고를 차감한다.
- Stock 마이크로서비스는 재고 차감 이벤트를 생성한다.
- Delivery 마이크로서비스는 재고 차감 이벤트를 컨슘하여 배송을 생성한다.
- Delivery 마이크로서비스는 배송 생성 이벤트를 발행한다.
- Order 마이크로서비스는 배송 생성 이벤트를 컨슘하여 Pending 상태의 주문을 승인한다.
만약 트랜잭션이 중간에 실패하게 되면 다음과 같은 보상 트랜잭션을 통해 롤백을 처리한다.
- Delivery 마이크로서비스가 배송 생성 도중 실패하게 되면 배송 생성 실패 이벤트를 발행한다.
- Stock 마이크로서비스는 배송 생성 실패 이벤트를 컨슘하여 차감된 재고를 롤백한다.
- Stock 마이크로서비스는 차감된 재고 롤백 이벤트를 발행한다.
- Order 마이크로서비스는 차감된 재고 롤백 이벤트를 컨슘하여 Pending 상태의 주문을 반려한다.
오케스트레이션 사가 패턴(Orchestration Saga Pattern)
중앙의 컨트롤러가 전체 흐름과 보상 작업을 제어하는 패턴이다. 아래 이미지처럼 중앙 오케스트레이터(Manager)가 전체 트랜잭션의 흐름을 관리하고 각 서비스에게 언제 어떤 작업을 해야하는지 명시적으로 명령을 전달하는 구조다.(마치 오케스트라에서 지휘자가 각 연주자들에게 언제 어떻게 연주해야 하는지를 지시하는 것과 유사하다)
동일하게 커머스 시스템의 주문 생성 시나리오를 통해 살펴보자.
- Order 마이크로서비스는 Order Saga Orchester(Manager) 인스턴스를 생성한다.
- Order Saga Orchester(Manager) 인스턴스는 Pending 상태의 주문을 생성한다.
- Order Saga Orchester(Manager) 인스턴스는 재고 차감 명령 이벤트를 발행한다.
- Stock 마이크로서비스는 재고 차감 명령 이벤트를 컨슘하여 재고를 차감한다.
- Stock 마이크로서비스는 재고 차감 완료 이벤트를 발행한다.
- Order Saga Orchester(Manager) 인스턴스는 재고 차감 완료 이벤트를 컨슘후 배송 생성 명령 이벤트를 발행한다.(Pending 상태의 주문의 트랜잭션 처리 현황을 갱신할 수도 있다)
- Delivery 마이크로서비스는 배송 생성 명령 이벤트를 컨슘하여 배송을 생성한다.
- Delivery 마이크로서비스는 배송 생성 완료 이벤트를 발행한다.
- Order Saga Orchester(Manager) 인스턴스는 배송 생성 완료 이벤트를 컨슘하여 Pending 상태의 주문을 승인한다.
만약 트랜잭션이 중간에 실패하게 되면 다음과 같은 보상 트랜잭션을 통해 롤백을 처리한다.
- Delivery 마이크로서비스가 배송 생성 도중 실패하게 되면 배송 생성 실패 이벤트를 발행한다.
- Order Saga Orchester(Manager) 인스턴스는 배송 생성 실패 이벤트를 컨슘후 주문 차감 롤백 명령 이벤트를 발행한다.(Pending 상태의 주문의 트랜잭션 처리 현황을 갱신할 수도 있다)
- Stock 마이크로서비스는 주문 차감 롤백 명령 이벤트를 컨슘하여 차감된 재고를 롤백한다.
- Stock 마이크로서비스는 주문 차감 롤백 완료 이벤트를 발행한다.
- Order Saga Orchester(Manager) 인스턴스는 주문 차감 롤백 완료 이벤트를 컨슘후 Pending 상태의 주문을 반려한다.
note: 모든 관리를 해주는 오케스트레이터(Manager)가 존재하니 중앙에서 컨트롤하면서 복잡성이 줄어들고 구현과 테스트가 상대적으로 쉽지만 이를 관리하는 Orchestrator 서비스가 추가되며, 과도하게 많은 비즈니스 로직이 오케스트레이터 안에 들어갈 위험이 있다. 이를 피하기 위해서는 오케스트레이터가 오퍼레이션 순서에 대해서만 책임지고 비지니스 로직을 포함하지 않도록 설계해야한다.
코레오그래피 사가 패턴 vs 오케스트레이션 사가 패턴
코레오그래피 사가 패턴
장점
- 참여자(연관된 마이크로서비스)가 적고 중앙제어가 필요 없는 경우에 적합하다.
- 추가 서비스 생성 및 소멸에 간섭이 없어 구성이 간편하고, 역할 분산으로 단일 실패 시점이 존재하지 않는다.
단점
- 명령 추적(트랜잭션 상태 파악)이 어렵고 워크플로우 파악이 복잡할 수 있다.
- Saga 참여자간 순환 종속성 발생 가능성이 존재한다.
- 통합 테스트가 어렵다.
오케스트레이션 사가 패턴
장점
- 참여자(연관된 마이크로서비스)가 많고, 복잡한 워크 플로우에서 적합하며, 프로세스 흐름의 제어가 가능하다.
- 중앙 오케스트레이터로 인해 순환 종속성 발생 우려가 없다.
단점
- 중앙 통제를 위한 로직이 복잡할 수 있다.
- 모든 워크플로우를 관리하므로 단일 실패지점이 될 우려가 있다.
사가 패턴 적용 예제
토스에서 오케스트레이션 사가 패턴을 적용하여 분산 환경에서 데이터 정합성 문제를 해결했던 사례다. 자세한 내용은 아래 영상을 참고하자.
Reference
2PC
SAGA
2PC & SAGA