단일 Camel 인스턴스는 장애 발생 시 서비스가 중단됩니다. 클러스터링을 통해 여러 인스턴스를 동시에 실행하면 하나가 다운돼도 나머지가 계속 처리합니다. 하지만 모든 인스턴스가 같은 메시지를 처리하면 안 되므로 조정(coordination)이 필요합니다.
파일 폴러처럼 오직 하나의 인스턴스만 실행해야 하는 라우트에 Master/Slave 패턴을 적용합니다. Camel의 camel-zookeeper 컴포넌트를 사용합니다.
// Master 라우트 - Zookeeper 리더 선출 통해 하나만 활성화
from("zookeeper:localhost:2181/camel/master?delay=5000&shouldReconnect=true")
.routeId("file-poller-master")
.to("direct:startFilePolling");
from("direct:startFilePolling")
.from("file:incoming?move=.done")
.to("bean:fileProcessor"); Zookeeper가 리더 선출을 관리합니다. 현재 리더가 다운되면 자동으로 다른 인스턴스가 리더가 됩니다.
JMS 큐는 본질적으로 부하 분산을 제공합니다. 여러 Camel 인스턴스가 같은 큐를 소비하면 자동으로 메시지가 분배됩니다.
// 인스턴스1과 인스턴스2가 동일한 라우트 실행
// JMS 큐가 자동으로 부하 분산
from("activemq:queue:orders?concurrentConsumers=5")
.to("bean:orderProcessor"); concurrentConsumers를 높이면 단일 인스턴스에서 멀티스레드로 처리합니다.
Camel 3.x부터는 ClusterService 추상화를 통해 Zookeeper, Infinispan, Kubernetes 등 여러 클러스터 백엔드를 동일한 API로 사용합니다.
// Spring Boot에서 Kubernetes 클러스터 서비스 사용
camel.cluster.kubernetes.enabled=true
camel.cluster.kubernetes.cluster-labels[app]=camel-app
// 라우트에서 클러스터 인식 적용
from("master:file-cluster:file:incoming")
.to("bean:fileProcessor"); master: 접두사를 붙이면 클러스터에서 한 인스턴스만 해당 from을 활성화합니다.
여러 인스턴스 간 상태를 공유해야 할 때는 Redis나 Infinispan 같은 분산 캐시를 활용합니다.
// Redis를 Aggregation 저장소로 사용 (클러스터 전체 공유)
from("activemq:queue:parts")
.aggregate(header("correlationId"), new MyAggregator())
.completionSize(10)
.aggregationRepository(
new RedisAggregationRepository("agg-repo", jedisPool))
.to("bean:assemblyService"); 어떤 인스턴스가 다음 조각을 받아도 Redis에서 상태를 찾아 집계를 계속할 수 있습니다.
코스피 8% 폭락, 서킷브레이커 발동, SK텔레콤 Claude AI 차단까지. 한국의 AI 레버리지 버블이 단 하루…
SNS 사진 1장으로 30초 만에 딥페이크 영상이 완성됩니다. 당신의 얼굴이 이미 범죄에 악용되고 있을 수…
SNS 사진 1장으로 30초 만에 딥페이크 영상이 완성됩니다. 당신의 얼굴이 이미 범죄에 악용되고 있을 수…
달러/원 환율이 급등하는 이유와 실생활 영향을 정리했습니다. 지금 당장 활용할 수 있는 환전·투자 대응 전략까지…
미래에셋·미래에셋벤처투자·미래에셋생명이 동반 급등한 이유는 스페이스X 상장 기대감입니다. 세 회사가 스페이스X와 어떻게 연결되어 있는지 상세히 분석했습니다.
스페이스X 상장이 계속 미뤄지는 진짜 이유를 파헤쳤습니다. 화성 계획, 스타링크 분리, 국방 계약... 머스크가 절대…