더북(TheBook)

마이크로서비스 아키텍처를 고민하기 시작한 메리의 가장 큰 걱정거리는 여러 서비스에 걸친 트랜잭션의 구현 방법입니다. 거의 모든 엔터프라이즈 애플리케이션에서 트랜잭션은 필수 불가결한 구성품입니다. 트랜잭션 없이 데이터 일관성을 유지한다는 것은 생각하기 어렵죠.

ACID(원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)) 트랜잭션은 데이터를 배타적으로 접근해서 처리하는 것처럼 동작하기 때문에 개발자가 할 일이 매우 단순해집니다. 마이크로서비스 아키텍처에서도 단일 서비스 내부의 트랜잭션은 ACID가 보장하지만, 여러 서비스의 데이터를 업데이트하는 트랜잭션은 구현하기가 까다롭습니다.

2장의 createOrder()도 주문 서비스, 주방 서비스, 회계 서비스 등 여러 서비스가 관여된 작업입니다. 이런 작업을 수행하려면 여러 서비스에 걸쳐 트랜잭션을 관리할 수 있는 메커니즘이 필요합니다.

기존 분산 트랜잭션 관리 기법이 요즘 애플리케이션에 잘 맞지 않는 것은 공공연한 사실입니다. 여러 서비스에 걸친 작업의 데이터 일관성을 유지하려면 ACID 트랜잭션 대신 사가(saga)라는 메시지 주도(message-driven) 방식의 로컬 트랜잭션을 사용해야 합니다. 그런데 사가는 ACID에서 I(격리성)가 빠진 ACD(원자성, 일관성, 지속성)만 지원하고 격리가 되지 않기 때문에 동시 비정상(concurrency anomaly)의 영향을 방지하거나 줄일 수 있는 설계 기법(대책, countermeasure)을 적용해야 합니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.