카샤의 만개시기

마이크로서비스 시작하기 (5편) - 분산 트랜잭션 본문

Java/MSA

마이크로서비스 시작하기 (5편) - 분산 트랜잭션

SKaSha 2019. 6. 22. 02:41

트랜잭션은 모든 작업이 성공한 경우에만 작업이 커밋되어 데이터베이스에 반영되고 하나의 작업이라도 도중에 실패하면 모든 작업을 롤백하는 'all or nothing'의 조건을 만족해야 합니다. 데이터베이스가 N대의 샤드로 구성된 웹 서비스 환경에서는 분산 트랜잭션을 이용하여 이를 만족할수 있습니다.

분산 트랜잭션

분산 트랜잭션(distributed transaction)은 2개 이상의 네트워크 시스템 간의 트랜잭션입니다. 일반적으로 시스템은 트랜잭션 리소스의 역할을 하고, 트랜잭션 매니저는 이러한 리소스에 관련된 모든 동작에 대해 트랜잭션의 생성 및 관리를 담당합니다.
분산 트랜잭션은 다른 트랜잭션처럼 4가지 ACID(원자성, 일관성, 고립성, 지속성) 속성을 갖추어야 하며 여기에서 원자성은 일의 단위(UOW)를 위해 'all or nothing' 결과를 보증해야 합니다.

XA

XA는 분산 트랜잭션 처리를 위해 X/Open이 제정한 표준 스펙입니다. 멀티 트랜잭션 관리자와 로컬 리소스 관리자 사이의 인터페이스, 리소스 관리자가 트랜잭션을 처리하기 위해 필요한 것을 규정하고 있습니다.

2단계 커밋 프로토콜 수행을 통해, 분산된 데이터베이스에서 발생하는 각 트랜잭션을 원자적인 트랜잭션으로 구성할 수 있게 합니다.

2단계 커밋 프로토콜의 흐름
2단계 커밋 프로토콜의 흐름(출처: XA Transactions (2 Phase Commit): A Simple Guide - DZone Integration)
분산 트랜잭션의 개념 모델
그림 5 분산 트랜잭션의 개념 모델(출처: XA transactions using Spring | JavaWorld)

JTA

JTA(Java Transaction API)는 XA 리소스(예: 데이터베이스) 간의 분산 트랜잭션을 처리하는 Java API이며 javax.transaction와 javax.transaction.xa 두 개의 패키지로 구성됩니다.

Spring Boot는 Atomikos 또는 Bitronix 등 임베디드 트랜잭션 관리자 를 사용하여 여러 XA 리소스에 분산 된 JTA 트랜잭션을 지원합니다. Atomikos는 Spring Boot에 Built-in 되어 있는 가장 인기있는 오픈 소스 트랜잭션 관리자입니다.
JTA 트랜잭션은 적합한 Java EE 응용 프로그램 서버에 배포 할 때도 지원됩니다.

동일한 자원 관리자를 여러 트랜잭션 관리자가 safe하게 coordinate할 수 있도록 하려면 각 트랜잭션 관리자(Atomikos or Bitronix) 인스턴스를 고유 한 ID로 구성해야합니다. 기본적으로 이 ID는 트랜잭션 관리자가 실행중인 시스템의 IP 주소입니다.
production의 고유성을 보장하기 위해서는 spring.jta.transaction-manager-id 속성 값을 각 인스턴스에 대해 고유한 값으로 설정해야 합니다.

참고

https://d2.naver.com/helloworld/5812258
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-jta.html

NEXT

마이크로서비스 시작하기 (6편) - HATEOAS

Comments