Kafka는 초당 수백만 건의 이벤트를 처리할 수 있는 분산 스트리밍 플랫폼입니다. Camel은 Kafka에서 데이터를 받아 가공하고 여러 시스템으로 분배하는 복잡한 로직을 쉽게 표현할 수 있습니다. 둘의 조합은 현대 데이터 파이프라인의 핵심입니다.
camel-kafka 의존성을 추가하고 브로커 주소만 설정하면 바로 사용할 수 있습니다.
// 토픽에 메시지 발행 (Producer)
from("timer:event?period=1000")
.setBody(simple("이벤트 발생: ${date:now:HH:mm:ss}"))
.to("kafka:my-topic?brokers=localhost:9092");
// 토픽에서 메시지 소비 (Consumer)
from("kafka:my-topic?brokers=localhost:9092&groupId=my-group")
.log("수신: ${body}")
.to("bean:eventProcessor"); Kafka의 확장성은 파티션에서 나옵니다. 하나의 토픽을 여러 파티션으로 나누고, 컨슈머 그룹의 각 인스턴스가 서로 다른 파티션을 담당합니다.
// 파티션 키 지정
from("direct:send")
.setHeader(KafkaConstants.KEY, simple("${body.userId}"))
.to("kafka:orders?brokers=localhost:9092"); Kafka는 메시지를 디스크에 보관하고 소비자가 읽은 위치(오프셋)를 추적합니다. 이를 통해 처리 실패 시 재처리가 가능합니다.
// 수동 오프셋 커밋 (at-least-once 보장)
from("kafka:orders?brokers=localhost:9092&autoCommitEnable=false")
.process(exchange -> {
// 처리 성공 후에만 오프셋 커밋
exchange.getIn().setHeader(KafkaConstants.MANUAL_COMMIT,
exchange.getIn().getHeader(KafkaConstants.MANUAL_COMMIT));
})
.to("bean:orderService")
.process(exchange -> {
KafkaManualCommit commit = exchange.getIn()
.getHeader(KafkaConstants.MANUAL_COMMIT, KafkaManualCommit.class);
commit.commitSync();
}); Kafka + Camel로 실시간 ETL 파이프라인을 구축하는 전형적인 패턴입니다.
// 원시 로그 수신 → 파싱 → 필터링 → DB 저장 + 알림
from("kafka:raw-logs?brokers=localhost:9092&groupId=etl")
.unmarshal().json(LogEvent.class)
.filter(simple("${body.level} == 'ERROR'"))
.multicast()
.to("bean:logRepository?method=save")
.to("kafka:error-alerts?brokers=localhost:9092")
.end(); 이 파이프라인은 로그를 실시간으로 수신해 에러 로그만 걸러내어 DB에 저장하고 동시에 알림 토픽으로 발행합니다. Camel의 multicast와 filter EIP가 복잡한 분기 로직을 깔끔하게 표현합니다.
필기 시험의 접근통제 영역은 용어 하나만 알아도 풀리는 문제와 개념을 뒤집어 묻는 문제가 섞여 나옵니다.…
유튜브에 AI 자동 생성 영상이 넘쳐납니다. 진짜 크리에이터들은 어떻게 살아남아야 할까요? AI와 경쟁하는 3가지 생존…
이틀 전에 사이드카가 걸렸을 때만 해도 "한 번 놀란 장"으로 끝날 줄 알았는데요. 15일 아침…
오전 시황 글에 이어 장중 후속 정리입니다. 코스피는 개장 직후 5%대였던 낙폭이 오전 10시 전후에…
10월 15일 목요일 아침, 코스피가 전날 종가보다 5.59% 낮은 5,673.01로 출발했습니다. 장 시작 7분 만에…
삼성 갤럭시 AI, 써보니 실망스러웠다. 온디바이스 한계, 지역 제한, 낮은 일상 활용도 등 현실적인 문제점…