Knowledge

[Knowledge] MSA 트랜잭션 Two-Phase Commit 과 Saga Pattern을 알아보자~!

Jeong Jeon
반응형

이번에는 MSA 구조에서의 트랜잭션 관리를 어떤식으로 하는지 알아보도록 하자.

보통 모놀로틱 시스템 구조에 관계형 데이터베이스를 사용하는 곳에서는 DB자체에서 제공하는 트랜잭션을 통해 일관성있는 처리를 진행할 수 있다.

하지만 MSA구조에서는 A서버 B서버 각각 트랜잭션이 별도로 진행되기 때문에 둘중하나가 rollback됬을때 다른 쪽 서버에서는 알지 못하기 때문에 트랜잭션의 일관성을 유지할 수가없다.

 

이럴때는 어떻게 해야될까??

 

필자는 공부를 하기 전에 그냥 생각해봤을때, 아는 지식 내에서 처리를 어떻게 하지? 라는 종착점은 메시지 큐를 사용해서 이벤트기반으로 Success Fail에 대한 정보를 받아 사용하면 되지 않을까 였다. Kafka,MQ 등등?

 

하지만 예상이고, 실질적으로 보장되어있는 방식이 어떤것이 있을까 해서 찾아보게되었다.

방식은 두가지 정도 알게되었는데, Two-Phase commit과 Saga 이 두가지를 한번 알아보도록 하자..!

1). Two-Phase Commit

Prepare, Commit 이 2단계로 트랜잭션을 처리하는 방식을 말한다.

해당 트랜잭션에 관련된 마이크로서비스에서 트랜잭션 처리를 준비하고 트랜잭션을 처리할 준비가 되었다고 Coordinator에게 알린다. 이때 Coordinator는 트랜잭션을 조정해주는 중간자 역할을 한다.
그후 트랜잭션의 성공과 실패에 따라 커밋 또는 롤백을 코디네이터에게 전달하고, 그 결과를 모든 마이크로 서비스에 전달하여 Commit을 할지 Rollback을 할지 선택되어 진행된다.

Coordinator가 가장 중요한 역할을 하고 있는것을 알수 있다.

 

순서를 간단하게 정리하자면 아래와 같이 된다.

1). 트랜잭션이 각각 진행된다.

2). Coordinator가 각각 트랜잭션에 대한 응답을 기다린다.

3). 모든 트랜잭션이 성공하거나, 실패함에 따라 Coordinator에게 결과 메시지를 전달한다.

4). 모든 메시지가 성공한다면 Commit을 , 실패한게 있다면 Rollback을 진행한다.

5). 트랜잭션 종료~

 

이것만봐도 단점이 보이기 시작한다. 해당 방식은 Coordinator에 엄청난 의존성을 갖고있으며, 확장에 대해서는 어려워 보이기 때문이다...

그렇다면 Saga 방식은 어떨까? 확인해보도록 하자.

 

2). Saga Pattern

Saga는 DB가 주체자가 아닌 어플리케이션이 트랜잭션의 관리 주체인 패턴이다.각 어플리케이션은 자기가 담당하는 DB 트랜잭션만 담당하기 때문에 확장에 용이한 구조이다.

성공하면 성공에 대한, 실패하면 이전까지의 작업이 완료된 마이크서비스들에게 보상 (complemetary) 이벤트를 발행함으로써 분산 환경에서 원자성(atomicity)을 보장한다.

 

Saga패턴에는 아래와 같이 두가지가 있다. 구분은 Saga Instance를 별도로 사용하냐 마냐의 차이이다.

1). Choreography-Based : 운영에 대한 책임을 마이크로서비스에 분산시키는 방식

2). Orchestration-Based : 중앙 오케스트레이터에 의한 제어 방식

 

각각을 또 알아보자.!!!

 

1). Choreography-Based 

Kafka와 같은 MQ를 사용해서 각 모듈의 트랜잭션의 성공 실패를 전달하여 그다음 트랜잭션이 응답을 받고 받은 응답에 대한 처리를 결정해서 진행하는 방식이다..

각 서비스에서 트랜잭션을 진행하고, 해당 트랜잭션에 대한 정보를 event로 관련된 서비스로 발행한다.

해당 이벤트를 subscribe하고있는 서비스가 해당 결과를 받아 다음 트랜잭션을 진행하거나 종료한다.

이때 서비스들을 비동기로 처리할 수 있는데, 비동기로 처리한 트랜잭션은 해당 트랜잭션에 관련 없는 트랜잭션을 기준으로 분리해서 비동기로 만들어 사용할 수 있다.

설계에서 많은 생각을 해봐야 하는 부분이 있다.

 

2). Orchestration-Based 

Saga 인스턴스를 별도로 가지고 있다. 각 트랜잭션은 Saga 인스턴스의 manager에 의해 관리된다.

각 트랜잭션은 처리 후 결과를 manager에게 알려주고 해당 결과를 토대로 manager가 관리하게된다. 전체 트랜젝션이 종료되면 manager를 종료하고, 전체 1cycle 트랜잭션을 종료한다.

만약 트랜잭션이 한서비스에서 실패하게되면 해당 실패에 대한 보상 트랜잭션을 발행하여 관련 서비스에 발행하여 처리한다.

 

 

예전에 한번 찾아봤던 내용이었는데,,,, 막상 급할때 생각하려고 하면 기억이 나지않는다.

이런 상황을 고려하여 설계 해보고 개발해봤어야 했는데 아쉬운 부분이 많다.

 

항상 공부했던 내용들을 반영해서 써볼수 있는 환경을 만들어야겠다...!

반응형