본문 바로가기
Kotlin Spring/Kotlin Spring 강의 내용

10) Kafka 기반 도메인 분리 (4) Transactional Outbox 패턴이란?

by Bill Lab 2025. 9. 20.
728x90

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. 로직 구현

예정

728x90