Skip to content

SyncBoot Saga 분산 트랜잭션 구현 ​

1. MSA 분산 트랜잭션의 도전 과제 ​

마이크로서비스 아키텍처(MSA)에서는 각 서비스가 독립된 데이터베이스를 소유하므로, 전통적인 단일 DB 2PC(Two-Phase Commit) 분산 락은 시스템 가용성을 심각하게 저해합니다.
SyncBoot는 Saga 패턴(Orchestrated Saga)을 표준으로 채택하여 비동기 메시지 또는 REST 이벤트를 통해 로컬 트랜잭션을 연속 실행하고, 중간 실패 시 사전에 정의된 보상 트랜잭션(Compensating Transaction)을 역순으로 자율 실행합니다.


2. 분산 트랜잭션 상태 머신 (State Machine) ​


3. 보상 트랜잭션 실행 인터페이스 구현 ​

모든 분산 액션은 SagaStep 인터페이스를 상속받아 정방향 실행(execute)과 역방향 롤백(compensate)을 1:1로 구현해야 합니다:

java
package com.empasy.sync.boot.saga;

public interface SagaStep<T, R> {
    String getStepName();
    R execute(T context);
    void compensate(T context);
}

3.1 주문-재고 연동 Saga Step 예제 ​

java
package com.empasy.sync.boot.saga.steps;

import com.empasy.sync.boot.saga.SagaStep;
import lombok.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class InventoryDeductionStep implements SagaStep<OrderContext, Boolean> {

    @Override
    public String getStepName() {
        return "INVENTORY_DEDUCTION";
    }

    @Override
    public Boolean execute(OrderContext context) {
        log.info("[Saga:Tx] Deducting stock for item: {}, qty: {}", context.getProductId(), context.getQuantity());
        // 실제 재고 감액 비즈니스 로직 수행
        return true;
    }

    @Override
    public void compensate(OrderContext context) {
        log.warn("[Saga:Compensate] Rolling back inventory for item: {}, restoring qty: {}", 
                context.getProductId(), context.getQuantity());
        // 결제 실패 등에 따른 재고 복원 보상 쿼리 실행
    }
}