Categories: Camel프레임워크

[Camel in Action] 실전편 – Camel Saga와 분산 트랜잭션 패턴 총정리

Saga 패턴의 핵심 개념

분산 시스템에서 2PC(2-Phase Commit)는 성능과 가용성 문제로 마이크로서비스에 적합하지 않습니다. Saga 패턴은 각 서비스의 로컬 트랜잭션을 이벤트로 연결하고, 실패 시 이전 단계를 보상(취소)하는 방식으로 최종 일관성을 달성합니다.

e-커머스 주문 처리 Saga

주문 → 재고 예약 → 결제 → 배송 예약의 단계에서 어느 단계든 실패하면 이전 단계들이 자동으로 취소됩니다.

from("direct:placeOrder")
  .saga()
    .timeout(Duration.ofMinutes(5)) // 5분 내 완료되지 않으면 보상
    .compensation("direct:cancelOrder") // 실패 시 실행할 보상 라우트
    .option("orderId", header("orderId"))
  .to("direct:reserveInventory")  // 1단계: 재고 예약
  .to("direct:processPayment")    // 2단계: 결제
  .to("direct:arrangeShipping")   // 3단계: 배송 예약
  .end()
  .log("주문 완료: ${header.orderId}");

보상 라우트 구현

// 주문 취소 보상 라우트
from("direct:cancelOrder")
  .log("주문 취소 보상 시작: ${header.orderId}")
  .multicast()
    .to("direct:releaseInventory")   // 재고 예약 해제
    .to("direct:refundPayment")      // 결제 취소
    .to("direct:cancelShipping")     // 배송 취소
  .end()
  .log("주문 취소 완료: ${header.orderId}");

// 각 단계도 보상 라우트 가짐
from("direct:reserveInventory")
  .saga()
    .propagation(SagaPropagation.MANDATORY)
    .compensation("direct:releaseInventory")
  .to("bean:inventoryService?method=reserve")
  .end();

Saga 상태 영속화

Saga가 진행 중에 서버가 재시작되면 상태를 잃지 않아야 합니다. Camel Saga는 상태 저장소를 설정할 수 있습니다.

// DB 기반 Saga 저장소
JdbcSagaRepository sagaRepository = new JdbcSagaRepository(dataSource);
context.addService(sagaRepository);

// 또는 InMemory (테스트용)
InMemorySagaService sagaService = new InMemorySagaService();
context.addService(sagaService);

타임아웃과 멱등성 처리

from("direct:processPaymentStep")
  .saga()
    .propagation(SagaPropagation.MANDATORY)
    .option("sagaId", exchangeProperty(Exchange.SAGA_LONG_RUNNING_ACTION))
    .compensation("direct:refundPayment")
  .idempotentConsumer(
    exchangeProperty(Exchange.SAGA_LONG_RUNNING_ACTION),
    MemoryIdempotentRepository.memoryIdempotentRepository(1000))
  .process(exchange -> {
    // 멱등 처리: 같은 sagaId로 재시도해도 중복 결제 안 됨
    paymentService.charge(exchange.getIn().getBody(Order.class));
  })
  .end();

Saga vs 2PC 선택 기준

  • Saga 적합: 마이크로서비스, 높은 가용성, 긴 실행 트랜잭션, 최종 일관성 허용
  • 2PC 적합: 즉각적인 일관성 필수, 짧은 트랜잭션, 모든 참여자가 XA 지원

대부분의 현대 마이크로서비스 시스템에서는 Saga가 더 적합합니다. 단, UI에서 즉시 결과를 보여줘야 한다면 낙관적 UI 업데이트와 함께 사용합니다.

zerg96

Recent Posts

정보보안기사 필기 핵심 개념, 접근통제·인증 8문제로 정리

필기 시험의 접근통제 영역은 용어 하나만 알아도 풀리는 문제와 개념을 뒤집어 묻는 문제가 섞여 나옵니다.…

2시간 ago

유튜브 AI 영상 범람, 진짜 크리에이터는 어떻게 살아남나

유튜브에 AI 자동 생성 영상이 넘쳐납니다. 진짜 크리에이터들은 어떻게 살아남아야 할까요? AI와 경쟁하는 3가지 생존…

3시간 ago

코스피 사이드카 이틀 만에 또 발동, 올해만 27번째…5분간 멈추는 건 ‘프로그램 매도’뿐입니다

이틀 전에 사이드카가 걸렸을 때만 해도 "한 번 놀란 장"으로 끝날 줄 알았는데요. 15일 아침…

3시간 ago

코스피 낙폭 7%로 확대, 외국인 1.7조 순매도: 10월 15일 오전 10시 시황

오전 시황 글에 이어 장중 후속 정리입니다. 코스피는 개장 직후 5%대였던 낙폭이 오전 10시 전후에…

7시간 ago

코스피 5.59% 급락 출발, 개장 7분 만에 매도 사이드카: 10월 15일 오전 시황

10월 15일 목요일 아침, 코스피가 전날 종가보다 5.59% 낮은 5,673.01로 출발했습니다. 장 시작 7분 만에…

7시간 ago

삼성 갤럭시 AI, 솔직히 기대 이하였다 — 실망스러운 이유 TOP 5

삼성 갤럭시 AI, 써보니 실망스러웠다. 온디바이스 한계, 지역 제한, 낮은 일상 활용도 등 현실적인 문제점…

8시간 ago