1. CAP 이론 이란?
1) 정의
- 분산 시스템에서 동시에 만족할 수 없는 세 가지 특성을 설명하는 이론
- 2000년 Eric Brewer가 제안 → "Brewer’s theorem"
2) 세 가지 요소
- C (Consistency, 일관성)
: 모든 노드가 동시에 같은 데이터를 보며, 어떤 노드에서 읽든 항상 최신 데이터가 보장됨
- A (Availability, 가용성)
: 모든 요청에 대해 항상 응답을 돌려줌, 다만 최신 데이터일 필요는 없음
- P (Partition Tolerance, 파티션 허용성)
: 네트워크 장애나 노드 분리 상황(Partition)에서도 시스템이 동작 가능
분산 시스템은 C, A, P 세 가지 중에서 동시에 두 가지만 보장할 수 있고, 세 가지를 모두 충족할 수는 없다.
3) 조합별 특징
- CA (일관성 + 가용성)
: 네트워크 분할이 없을 때만 의미 있음 → 현실적으론 불가능
- CP (일관성 + 파티션 허용성)
: 네트워크 분할 시, 일관성을 지키기 위해 가용성을 희생
- AP (가용성 + 파티션 허용성)
: 네트워크 분할 시, 일관성은 희생하고 가용성을 보장
AP를 선택하고 C는 최종적 Data로 보장하자!
2. Transactional Outbox 패턴 원리 및 프로세스
1) 분산 트랜잭션에서 메시지 손실
: 마이크로서비스에서 DB 트랜잭션 + 메시지 발행(Kafka producer)를 동시에 처리할 때 문제가 발생 함.
2) 시나리오 기반 예시
- 서비스 A가 DB에 주문 정보를 저장
- Kafka로 주문 생성 이벤트 발행
- 만약 DB 저장은 성공했는데 메시지 발행이 실패하면?
- 이벤트가 날아가지 않아 다른 서비스가 주문 정보를 모르고, 데이터 불일치 발생
3) Transactional Outbox 패턴 적용하여 해결
- 메시지를 DB 트랜잭션 안에서 함께 기록하고, 별도의 프로세스가 안전하게 메시지를 발행하도록 분리
- DB 저장과 이벤트 저장을 같은 트랜잭션으로 묶음(메시지 손실 방지)
- outbox 테이블 column 구조
: id (PK), aggregate_id (주문 등 식별), payload (JSON), status (PENDING, SENT 등), created_at 등
4) 프로세스 흐름
(1) 비즈니스 트랜잭션 시작
- 주문 생성 로직 실행
(2) DB 트랜잭션 안에서 Outbox에 이벤트 저장
- INSERT INTO outbox ...
- DB 트랜잭션 커밋 시점에 orders + outbox 둘 다 커밋됨
(3) Outbox Publisher 프로세스
- 주기적으로 outbox 테이블에서 PENDING 이벤트 조회
- Kafka 등 메시지 큐로 발행
- 발행 성공 시 status → sent로 업데이트
(4) 메시지 중복 방지
- status 필드 또는 idempotency 키 사용
- 이벤트 중복 처리 가능
5) 장점
- 데이터 일관성 보장(C): DB와 메시지 발행이 결합된 트랜잭션으로 안전
- 비동기 처리 가능(A): 메시지 큐로 안전하게 발행
- 재시도 구조 용이(실패 시 publisher가 재시도)
3. 로직 구현
예정
'Kotlin Spring > Kotlin Spring 강의 내용' 카테고리의 다른 글
| 10) Kafka 기반 도메인 분리 (3) Saga 패턴이란? (0) | 2025.09.20 |
|---|---|
| 10) Kafka 기반 도메인 분리 (2) 결제 시 쿠폰도메인을 완전하게 분리하기 (0) | 2025.09.20 |
| 10) Kafka 기반 도메인 분리 (1) Kafka 란? (0) | 2025.09.20 |
| 9) Spring 캐시 (4) Redis 로 캐싱 관리 (0) | 2025.09.20 |
| 9) Spring 캐시 (3)redis란? (1) | 2025.09.20 |