본문 바로가기
개발관련

MSA 분산 트랜잭션

by 부발자 2020. 4. 27.

MSA에서 분산 트랜잭션 관련해서 한번 알아보자.

 

서비스를 만들때 요즘 많이들 MSA 지향하고 기존 모놀리틱 아키텍처에서 MSA 로 전향해 나아가고 있다.

MSA로 만들때 가장 힘든것 중에 하나는 분산 트랜잭션 관리이다.

기존 모놀리틱 아키텍처에서는 DB의 ACID(Atomicity, Consistency, Isolation, Durability)로 특성을 이용하여 트랜잭션을 보장하지만, MSA는 각 서비스 별로 DB가 있으니까 일관성을 유지해주는 것이 다소 번거롭고 어렵기도 하다.

 

문제를 정의해보자

각 마이크로 서비스를 거쳐 데이터의 일관성을 어떻게 유지해 줄 것인가?

 

사례) 주문을 생성할때, 고객의 예치금을 차감해야 하고, 배송을 접수해야 한다.

 - 주문 서비스, 고객 서비스, 배송 서비스로 세개의 마이크로 서비스가 존재한다.

 - 고객 서비스에서 예치금을 차감해야지만 주문을 생성할수 있다.

 - 예치금이 부족하다면 주문 생성을 거절해야 한다.

 - 주문이 생성되면 배송 서비스로 접수해야 한다.

 

 

주문 프로세스

 

 

 

MSA에서는 분산 트랜잭션을 구현하는 방식이 2가지가 있다.

 

1. Two-Phase Commit

2. Saga Pattern

 

분산 시스템에서는 가용성과 일관성을 모두 만족하지 못한다.  Two-Phase Commit 방식을 보면 가용성은 떨어지는데, 일관성은 만족할수 있고, 반대로 Saga Pattern 방식을 보면 가용성을 만족하지만 일관성은 다소 떨어지기도 한다.

 

 

Two-Phase Commit

준비단계와 처리단계의 API 호출로 분리하여 처리하는 기법이다.

API를 호출할때 Prepare API 를 먼저 호출하고 모든 처리가 완료되면 Commit API 를 호출해주는 것이다.

 

 

Two-Phase Commit 프로세스

 

 

Two-Phase Commit 으로 글로벌 트랜잭션 처리시 아래와 같은 문제가 발생한다.

1. 예치금 차감 호출이 실패되면 주문 생성을 하지 못한다.

2. 배송 접수를 실패하면 예치금 차감 롤백을 호출 해야 한다.

3. 예치금 차감을 롤백하면 주문 접수된 것을 롤백해야 한다.

4. 예치금 차감 롤백 호출시 실패나면 어떻게 처리를 할 것인가?

 

장점

 - 별도의 처리가 필요하지 않고 HTTP API 로만 처리가 가능하다.

 - 개발자들에게 다소 익순한 패턴이다.

단점

 - 가용성이 떨어진다.

 - 글로벌 트랜잭션으로 하나라도 실패하면 모두 롤백해야 한다.

 

 

Saga Pattern

Saga 패턴은 Eventual Consistency를 바탕을 둔 로컬 트랜젝션을 연속적으로 업데이트를 수행하는 패턴이다.

그럼 Eventual Consistency 는 무엇인지 확인하고 넘어가자.

 

Eventual Consistency 란?
분산 컴퓨팅에 쓰이는 일관성 모델의 하나로, 데이터 항목에 새로운 업데이트가 없으면 궁극적으로 해당 항목에 대한 모든 접근들은 마지막으로 업데이트된 값을 반환하는 것을 비공식적으로 보장하는 고가용성을 달성한다
특정 항목들이 즉시 반영되지 않는다라는 것을 허용하고, 결국에는 언젠간 일관성을 유지하게 된다라는 것이다.

 

아래 그림과 같이 각 로컬에서 데이터를 업데이트 하고, Message or Event 를 다음 로컬 트랜젝션으로 전달하는 방식이다.

 

 

Saga 패턴

 

장점 

 - 가용성이 좋다. (특정 서비스가 제대로 동작을 하지 않더라도, 재처리를 통해서 언젠가는 처리가 된다.)

 - 여러 서비스들 사이에서 밀접한 결합성이 없이도 데이터 일관성을 유지하는데 도움을 준다.

단점

 - 개발자들이 전통적인 트랜션 처리만큼 Saga pattern에 익숙하지 않다.

 - 별도의 처리가 필요함으로 시스템 간의 복잡도가 증가한다.

 

Saga 패턴의 2가지 구현 방법

1. Choreography-based saga

2. Orchestration-based saga

 

이 두 방식은 아래 링크에 자세히 나와 있으므로 참고하도록 한다.

https://microservices.io/patterns/data/saga.html

Microservices Pattern: Sagas

Use a saga, which is sequence of local transactions

microservices.io

 

반응형

'개발관련' 카테고리의 다른 글

Spring 에서 Service 인터페이스 사용?  (0) 2020.05.20
MSA 에서 Service Mesh 란?  (0) 2020.05.19
Optimistic Lock과 Pessimistic Lock  (0) 2020.04.15
Webflux vs WebMvc 성능 비교  (0) 2020.04.06
Spring Webflux Cold / Hot 이해하기  (0) 2020.03.29