홈으로 돌아가기

RabbitMQ에서의 분산 오케스트레이션

이 글은 Apache Camel 대체재로서 RabbitMQ에서의 분산 오케스트레이션을 위한 라이브러리를 설명합니다. 상세: 엔티티, 실행 모드, 마이그레이션. 장점: 상태 복구, 스케일링.

RabbitMQ 오케스트레이션: 마이크로서비스에서 Camel 포기
Advertisement 728x90

RabbitMQ를 활용한 분산형 프로세스 오케스트레이션: Apache Camel 대안

FTP 파일과 Kafka/RabbitMQ 스트림에서 대량의 데이터를 처리하는 시스템은 40개 이상의 서비스로 구성된 마이크로서비스 아키텍처를 사용합니다. 이전에는 처리 체인이 Apache Camel을 통해 Java DSL로 구현되었으며, 중앙 서비스에서 REST 호출을 수행했습니다. 문제점으로는 재시작 시 상태 손실, 병렬 스트림으로 인한 확장 제한, 릴리스 시 위험 등이 있었습니다.

쿼럼 큐를 지원하는 새로운 RabbitMQ 라이브러리를 통해 분산형 관리를 가능하게 했습니다. 상태는 브로커에 보존되며, 프로세스는 자동으로 재개됩니다. 초기화 서비스는 수평적으로 확장됩니다.

핵심 라이브러리 엔티티

라이브러리에는 단계, 경로, 실행자를 위한 클래스와 인터페이스가 포함됩니다:

Google AdInline article slot
  • RouteStepInfo: 경로 내 단계를 식별합니다.
public class RouteStepInfo {
    private final String routeName;
    private final String stepId;

    public RouteStepInfo(String routeName, String stepId) {
        this.routeName = routeName;
        this.stepId = stepId;
    }
}
  • StepExecutor: 비동기/동기/분리 실행을 위한 인터페이스입니다.
public interface StepExecutor {
    String getStepName();
    void runAsync(RouteStepInfo routeStepInfo, Long objectId);
    void runSync(RouteStepInfo routeStepInfo, Long objectId);
    void runDetached(RouteStepInfo routeStepInfo, Long objectId);
    void appendListener(StepExecutionFinishedListener listener);
}
  • StepExecutionFinishedListener: 단계 완료 시 콜백입니다.
public interface StepExecutionFinishedListener {
    void onStepExecutionFinished(RouteStepInfo routeStepInfo, Long objectId);
}
  • RouteStep: ASYNC, SYNC, DETACHED 모드를 지원하는 단계입니다.
public interface RouteStep {
    String getRouteName();
    String getStepId();
    String getStepName();
    ExecutionMode getExecutionMode();
    void run(Long objectId);
    void appendListener(StepExecutionFinishedListener listener);

    enum ExecutionMode {
        ASYNC,
        SYNC,
        DETACHED
    }
}
  • ExecutionRoute: 인덱스가 포함된 단계 목록으로 구성된 경로입니다.
@Slf4j
public class ExecutionRoute {
    @Getter
    private final String routeName;
    private final List<RouteStep> routeSteps;
    private final Map<String, Integer> stepsIndex;

    public ExecutionRoute(String routeName, List<RouteStep> routeSteps) {
        this.routeName = routeName;
        this.routeSteps = routeSteps;
        this.stepsIndex = new HashMap<>();
        for (int i = 0; i < routeSteps.size(); i++) {
            stepsIndex.put(routeSteps.get(i).getStepId(), i);
        }
    }
}

추가로: 구성용 RoutesConfigBuilder, 경로 제공용 RouterConfigProvider, 리스너이자 실행자 역할의 ProcessRouter가 있습니다.

단계 실행 모드

라이브러리는 세 가지 모드를 지원합니다:

  • ASYNC: 순차적 백그라운드 실행으로, 완료 후 다음 단계로 이동합니다.
  • SYNC: 블로킹 호출로, 전체 체인 완료 후 반환됩니다.
  • DETACHED: 대기 없이 실행하며, 즉시 다음으로 진행합니다.

조합을 통해 분기와 병렬 처리가 가능합니다:

Google AdInline article slot
  • 경로 1: SYNC 단계 1→2→3.
  • 경로 2: ASYNC 단계 1→2→3, 즉시 반환.
  • 경로 3: DETACHED 단계 2가 포함된 ASYNC.
  • 경로 5: 병렬 하위 경로 경로 4.

구현 및 마이그레이션

부하 테스트를 통해 기능을 확인했습니다. 마이그레이션은 단계적으로 진행되며, Camel 부분을 A/B 스위칭으로 대체합니다. 기존 종속성은 롤백을 위해 유지됩니다.

핵심 포인트:

  • RabbitMQ의 상태 보존으로 재시작 후 재개 가능.
  • 초기화 서비스의 수평적 확장.
  • 빌더를 통한 투명한 구성.
  • 중앙 서비스 없이 분기 및 병렬 처리 지원.

이 접근 방식은 높은 신뢰성과 확장성이 요구되는 시스템에 적합합니다.

Google AdInline article slot

— Editorial Team

Advertisement 728x90

다음 읽기