Categories: Camel프레임워크

[Camel in Action] 11-2. Camel 트랜잭션 처리 – 분산 시스템에서 데이터 일관성 보장

분산 시스템에서 트랜잭션이 어려운 이유

단일 데이터베이스의 트랜잭션은 ACID를 보장합니다. 하지만 JMS 큐 + 데이터베이스를 동시에 사용할 때는 두 시스템을 하나의 트랜잭션으로 묶어야 합니다. 이것이 분산 트랜잭션 문제입니다.

JMS 트랜잭션 설정

JMS 컴포넌트에 transacted=true를 설정하면 메시지 수신과 처리를 하나의 JMS 트랜잭션으로 묶습니다.

from("activemq:queue:orders?transacted=true")
  .transacted()
  .process(exchange -> {
    // 처리 중 예외 발생 시 JMS 트랜잭션 자동 롤백
    // 메시지가 큐로 다시 돌아감
    orderService.process(exchange.getIn().getBody(Order.class));
  })
  .to("activemq:queue:confirmed-orders");

JMS + DB 동시 트랜잭션

JMS 메시지를 받아 DB에 저장하는 작업을 하나의 트랜잭션으로 처리하려면 JTA(Java Transaction API) 트랜잭션 매니저가 필요합니다.

// Spring XML 설정
<bean id="jtaTransactionManager"
  class="org.springframework.transaction.jta.JtaTransactionManager"/>

<camelContext>
  <route>
    <from uri="activemq:queue:orders?transacted=true"/>
    <transacted ref="jtaTransactionManager"/>
    <to uri="bean:orderService?method=saveOrder"/>
    <to uri="activemq:queue:order-confirmed"/>
  </route>
</camelContext>

JTA는 강력하지만 2PC(2-Phase Commit) 프로토콜로 인해 성능 부담이 있습니다. 모든 시스템이 XA 트랜잭션을 지원해야 합니다.

Idempotent Consumer – 중복 처리 방지

네트워크 오류로 메시지가 재전송될 때 같은 메시지를 두 번 처리하는 것을 막는 패턴입니다.

from("activemq:queue:payments")
  .idempotentConsumer(
    header("paymentId"),
    JdbcMessageIdRepository.jpaMessageIdRepository(dataSource, "payments"))
  .process(exchange -> {
    // paymentId가 처음 본 것일 때만 이 코드가 실행됨
    paymentService.process(exchange.getIn().getBody());
  });

처리한 메시지 ID를 DB나 Redis에 저장하고, 다음에 같은 ID가 오면 건너뜁니다.

SAGA 패턴 – 분산 트랜잭션의 현대적 대안

마이크로서비스 환경에서 JTA를 쓰기 어려울 때 SAGA 패턴이 대안입니다. 각 단계가 성공하면 다음 단계로, 실패하면 이전 단계를 보상(compensate)하는 방식입니다.

// Camel SAGA EIP
from("direct:placeOrder")
  .saga()
    .to("direct:reserveInventory")
    .to("direct:processPayment")
    .to("direct:arrangeShipping")
  .compensation("direct:cancelOrder")
  .end();

from("direct:cancelOrder")
  .to("direct:releaseInventory")
  .to("direct:refundPayment");

SAGA는 최종적 일관성(eventual consistency)을 보장합니다. 즉각적인 일관성이 필요 없고 성능이 중요한 경우에 적합합니다.

zerg96

Share
Published by
zerg96

Recent Posts

충격! 코스피 8% 폭락에 SK텔레콤 AI 차단까지 – 한국의 AI 도박이 터졌다

코스피 8% 폭락, 서킷브레이커 발동, SK텔레콤 Claude AI 차단까지. 한국의 AI 레버리지 버블이 단 하루…

3주 ago

당신 얼굴이 이미 쓰이고 있다… AI 딥페이크 범죄, 생각보다 훨씬 심각합니다

SNS 사진 1장으로 30초 만에 딥페이크 영상이 완성됩니다. 당신의 얼굴이 이미 범죄에 악용되고 있을 수…

4주 ago

당신 얼굴이 이미 쓰이고 있다 — AI 딥페이크 범죄, 생각보다 훨씬 심각합니다

SNS 사진 1장으로 30초 만에 딥페이크 영상이 완성됩니다. 당신의 얼굴이 이미 범죄에 악용되고 있을 수…

4주 ago

달러·원 환율 급등, 지금 당신이 꼭 알아야 할 것들

달러/원 환율이 급등하는 이유와 실생활 영향을 정리했습니다. 지금 당장 활용할 수 있는 환전·투자 대응 전략까지…

4주 ago

미래에셋·미래에셋벤처투자·미래에셋생명 동반 급등, 스페이스X와 무슨 관계?

미래에셋·미래에셋벤처투자·미래에셋생명이 동반 급등한 이유는 스페이스X 상장 기대감입니다. 세 회사가 스페이스X와 어떻게 연결되어 있는지 상세히 분석했습니다.

4주 ago

스페이스X 상장 D-데이? 일론 머스크가 절대 말 안 하는 진짜 이유

스페이스X 상장이 계속 미뤄지는 진짜 이유를 파헤쳤습니다. 화성 계획, 스타링크 분리, 국방 계약... 머스크가 절대…

4주 ago