분산 시스템에서 2PC(2-Phase Commit)는 성능과 가용성 문제로 마이크로서비스에 적합하지 않습니다. 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가 진행 중에 서버가 재시작되면 상태를 잃지 않아야 합니다. 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가 더 적합합니다. 단, UI에서 즉시 결과를 보여줘야 한다면 낙관적 UI 업데이트와 함께 사용합니다.
국내 금융권에서 AI를 이용한 해킹과 대규모 정보유출이 잇따르자, 은행들이 이제 해외 법인과 지점의 보안까지 다시…
서울 전역이 토지거래허가구역으로 묶인 지 1년이 됐습니다. 집을 못 팔게 막으면 값이 내려갈 거라는 기대도…
어제 5거래일 연속으로 밀렸던 코스피가 오늘 아침 확 반등했습니다. 오전 9시 12분 기준 코스피는 6,165.02로…
AI 이야기는 이제 "어떤 모델이 더 똑똑한가"에서 "누가 계산 자원을 더 싸고 안정적으로 쥐고 있나"로…
어제 코스피가 하루에 348.89포인트, 5.46% 빠지면서 6,035.35로 마감했습니다. 장중에는 5,911선까지 밀렸다가 겨우 6,000선 위로 올라왔는데요,…