원칙: 마이크로서비스 아키텍처의 핵심 원칙 중 하나는 "서비스당 하나의 데이터베이스(Database per Service)"입니다.
이유:
문제점: 데이터베이스가 서비스별로 분리되면서, 여러 서비스에 걸쳐 데이터의 원자성(Atomicity)을 보장해야 하는 분산 트랜잭션 문제가 발생합니다.
주문 DB에는 "주문 생성"이 기록되고, 결제 DB에는 "결제 완료"가 기록되어야 합니다. 만약 주문 생성은 성공했는데, 결제 처리에서 오류가 발생하면 어떻게 될까요? 주문 데이터만 남고 결제는 이루어지지 않은, 데이터 불일치(Inconsistency) 상태에 빠지게 됩니다.전통적인 2PC(Two-Phase Commit) 방식은 모든 서비스가 서로를 강하게 결합시켜 MSA의 장점을 해치므로, MSA 환경에서는 다른 접근 방식이 필요합니다.
사가(Saga)는 분산 환경에서 데이터의 최종 일관성(Eventual Consistency)을 보장하기 위한 트랜잭션 관리 패턴입니다.
핵심 아이디어: 하나의 거대한 트랜잭션을 여러 개의 로컬 트랜잭션과, 각 로컬 트랜잭션 실패 시 실행될 보상 트랜잭션(Compensating Transaction)으로 나누어 관리합니다.
동작 방식 (주문-결제 예시):
주문 생성 로컬 트랜잭션을 실행하고, 성공하면 "주문이 생성됨(OrderCreated)" 이벤트를 발행합니다.결제 처리 로컬 트랜잭션을 실행합니다.주문 취소 로컬 트랜잭션을 실행하여 데이터의 일관성을 맞춥니다.최종 일관성: 사가 패턴은 모든 작업이 즉시 원자적으로 처리되는 것을 보장하지는 않지만, 중간에 실패가 발생하더라도 보상 트랜잭션을 통해 결국에는(Eventually) 데이터가 일관된 상태에 도달하는 것을 보장합니다.
위에서 설명한 사가 패턴과 같은 이벤트 기반 아키텍처를 구현하기 위한 핵심 기술이 바로 메시지 큐입니다.
메시지 큐 (MQ)는 서비스 간의 통신을 비동기적(Asynchronous)으로 처리하고, 시스템을 느슨하게 결합시키는 미들웨어입니다. (e.g., RabbitMQ, Apache Kafka)
서비스 간의 비동기 통신:
이벤트 전달 보장:
유연한 확장: