분산 트랜잭션은 2개 이상의 시스템 간의 트랜잭션을 말한다. 예를 들자면 하나의 서비스에서 2개 이상의 DB를 사용할 때, 각각의 트랜잭션이 필요한 작업을 하나의 트랜잭션으로 처리하는 것 이다.
Spring은 JTA transaction manager를 통해 분산 트랜잭션을 관리한다.
JTA(Java Transaction API)는 XA 리소스 간의 분산 트랜잭션을 처리하는 자바 API이며 아래와 같은 기능을 제공한다.
XA는 분산 트랜잭션 처리를 위해 X/Open이 제정한 표준 스펙이다.
2단계 커밋 프로토콜은 트랜잭션에 참여하는 모든 데이터베이스가 정상적으로 수정되었음을 보장하는 두 단계 커밋 프로토콜. 합의 알고리즘을 통하여 분산된 트랜잭션의 정합성을 맞춤.
2단계 커밋 프로토콜은 코디네이터(트랜잭션 관리자)를 통해 트랜잭션 작업을 수행하는데,
MAS환경에서 대표적으로 사용되는 분산 트랜잭션을 제어하는 방법이다. 각 서비스 끼리 Event를 주고 받아 트랜잭션을 달성하며 하나의 서비스에서 실패 Event를 호출하면 나머지 서비스는 다시 rollback(보상)을 해줘야한다.
Event전달을 위해 kafka 같은 Event기반 Queue를 사용.
Choreography based은 각 서비스의 로컬에서 트랜잭션을 관리하며 event를 통해 트랜잭션을 맞춘다.
문제는 rollback인데 서비스 로컬에서 트랜잭션을 관리하여 commit된 작업을 rollback을 할 수 없어 실패 event를 받으면 보상트랜잭션 작업을 따로 작성해서 rollback처리를 해줘야하 한다.
Orchestration based은 각 서비스들이 Event를 주고 받는 것이 아닌 Orchestration(관리자) 인스턴스를 기반으로 Event를 주고 받아 분산 트랜잭션을 달성한다.
마찬가지로 실패 Event가 발생하면 Orchestration에서 보상 트랜잭션 작업을 요청하게 된다.
한 줄평 : saga패턴은 rollback작업을 보상작업으로 따로 관리해줘야한다.