RabbitMQ를 활용한 분산형 프로세스 오케스트레이션: Apache Camel 대안
FTP 파일과 Kafka/RabbitMQ 스트림에서 대량의 데이터를 처리하는 시스템은 40개 이상의 서비스로 구성된 마이크로서비스 아키텍처를 사용합니다. 이전에는 처리 체인이 Apache Camel을 통해 Java DSL로 구현되었으며, 중앙 서비스에서 REST 호출을 수행했습니다. 문제점으로는 재시작 시 상태 손실, 병렬 스트림으로 인한 확장 제한, 릴리스 시 위험 등이 있었습니다.
쿼럼 큐를 지원하는 새로운 RabbitMQ 라이브러리를 통해 분산형 관리를 가능하게 했습니다. 상태는 브로커에 보존되며, 프로세스는 자동으로 재개됩니다. 초기화 서비스는 수평적으로 확장됩니다.
핵심 라이브러리 엔티티
라이브러리에는 단계, 경로, 실행자를 위한 클래스와 인터페이스가 포함됩니다:
- 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: 대기 없이 실행하며, 즉시 다음으로 진행합니다.
조합을 통해 분기와 병렬 처리가 가능합니다:
- 경로 1: SYNC 단계 1→2→3.
- 경로 2: ASYNC 단계 1→2→3, 즉시 반환.
- 경로 3: DETACHED 단계 2가 포함된 ASYNC.
- 경로 5: 병렬 하위 경로 경로 4.
구현 및 마이그레이션
부하 테스트를 통해 기능을 확인했습니다. 마이그레이션은 단계적으로 진행되며, Camel 부분을 A/B 스위칭으로 대체합니다. 기존 종속성은 롤백을 위해 유지됩니다.
핵심 포인트:
- RabbitMQ의 상태 보존으로 재시작 후 재개 가능.
- 초기화 서비스의 수평적 확장.
- 빌더를 통한 투명한 구성.
- 중앙 서비스 없이 분기 및 병렬 처리 지원.
이 접근 방식은 높은 신뢰성과 확장성이 요구되는 시스템에 적합합니다.
— Editorial Team
아직 댓글이 없습니다.