분산 트랜잭션

무지성개발자·2023년 10월 15일
0

분산 트랜잭션

분산 트랜잭션은 2개 이상의 시스템 간의 트랜잭션을 말한다. 예를 들자면 하나의 서비스에서 2개 이상의 DB를 사용할 때, 각각의 트랜잭션이 필요한 작업을 하나의 트랜잭션으로 처리하는 것 이다.

Spring은 JTA transaction manager를 통해 분산 트랜잭션을 관리한다.

JTA

JTA(Java Transaction API)는 XA 리소스 간의 분산 트랜잭션을 처리하는 자바 API이며 아래와 같은 기능을 제공한다.

  • 트랜잭션 경계 설정
  • X/Open XA API를 사용하는 트랜잭션 처리

XA

XA는 분산 트랜잭션 처리를 위해 X/Open이 제정한 표준 스펙이다.

  • 멀티 트랜잭션 관리자와 로컬 리소스 관리자 사이의 인터페이스를 규정.
  • 리소스 관리자가 트랜잭션을 처리하기 위해 필요한 것을 규정.

2단계 커밋 프로토콜(Two-phase commit)

2단계 커밋 프로토콜은 트랜잭션에 참여하는 모든 데이터베이스가 정상적으로 수정되었음을 보장하는 두 단계 커밋 프로토콜. 합의 알고리즘을 통하여 분산된 트랜잭션의 정합성을 맞춤.

2단계 커밋 프로토콜은 코디네이터(트랜잭션 관리자)를 통해 트랜잭션 작업을 수행하는데,

  • 1 phase
    • 각 트랜잭션 작업이 끝나면 코디네이터가 commit 준비가 됐는지 질의.
  • 2 phase
    • 모든 참여 작업이 Yes 응답을 보내면 commit 요청을 보냄.
    • No응답이 하나라도 오면 abort요청을 보냄.
  • 합의 알고리즘
    • 분산 트랜잭션의 각 작업은 서로의 상태를 신뢰할 수 없음.
    • 때문에 상호검증을 통해서 서로의 작업이 제대로 완료 됐는지 확인 해야함.
    • 2단계 커밋 프로토콜은 코디네이터에의해 분산 트랜잭션의 작업 상태를 관리하여 신뢰할 수 있는 트랜잭션 작업을 함.

SAGA

MAS환경에서 대표적으로 사용되는 분산 트랜잭션을 제어하는 방법이다. 각 서비스 끼리 Event를 주고 받아 트랜잭션을 달성하며 하나의 서비스에서 실패 Event를 호출하면 나머지 서비스는 다시 rollback(보상)을 해줘야한다.

Event전달을 위해 kafka 같은 Event기반 Queue를 사용.

Choreography based SAGA pattern

Choreography based은 각 서비스의 로컬에서 트랜잭션을 관리하며 event를 통해 트랜잭션을 맞춘다.

  • 성공 시나리오
    • 1번 서비스 커밋 성공.
    • 2번 서비스로 성공 event 전달.
    • 2번 서비스 커밋 성공.
    • 3번 서비스로 성공 event전달.
    • 서비스 수 만큼 반복.

문제는 rollback인데 서비스 로컬에서 트랜잭션을 관리하여 commit된 작업을 rollback을 할 수 없어 실패 event를 받으면 보상트랜잭션 작업을 따로 작성해서 rollback처리를 해줘야하 한다.

  • 실패 시나리오
    • 1번 서비스 커밋 성공.
    • 2번 서비스로 성공 event 전달.
    • 2번 서비스 커밋 성공.
    • 3번 서비스로 성공 event전달.
    • 3번 서비스 작업 실패.
    • 1번, 2번 서비스에 실패 event전달.
    • 1번, 2번 서비스 트랜잭션 보상작업(rollback).

Orchestration based SAGA pattern

Orchestration based은 각 서비스들이 Event를 주고 받는 것이 아닌 Orchestration(관리자) 인스턴스를 기반으로 Event를 주고 받아 분산 트랜잭션을 달성한다.

마찬가지로 실패 Event가 발생하면 Orchestration에서 보상 트랜잭션 작업을 요청하게 된다.


한 줄평 : saga패턴은 rollback작업을 보상작업으로 따로 관리해줘야한다.

profile
no-intelli 개발자 입니다. 그래도 intellij는 씁니다.

0개의 댓글