들어가며
MSA 환경에서 메시지 브로커 선택은 시스템 성능을 좌우하는 중요한 결정입니다. Apache Kafka와 RabbitMQ는 각각 다른 강점을 가진 대표적인 메시지 브로커입니다. 이번 글에서는 두 도구의 차이점과 최적의 선택 기준을 알아보겠습니다.
철학: "모든 데이터는 스트림이다"
철학: "메시지 전달의 신뢰성과 유연성"
| 항목 | Kafka | RabbitMQ |
|---|---|---|
| 처리량 | 초당 수백만 메시지 | 초당 수만~수십만 메시지 |
| 지연시간 | 2-5ms (평균) | 1-5ms (평균) |
| 데이터 보관 | TB 단위 장기 보관 | GB 단위 임시 보관 |
@KafkaListener(topics = "order-events")
public void processOrder(OrderEvent event) {
// 배치로 처리, 같은 메시지를 여러 Consumer가 소비 가능
}
@RabbitListener(queues = "order.queue")
public void processOrder(OrderEvent event) {
// 즉시 처리, 메시지 소비 후 큐에서 제거
}
// 복잡한 조건부 라우팅 가능
@Bean
public Binding urgentOrderBinding() {
return BindingBuilder
.bind(urgentOrderQueue())
.to(orderExchange())
.with("order.urgent.*");
}
✅ 대용량 실시간 데이터 처리
✅ 이벤트 소싱 및 데이터 파이프라인
✅ 히스토리 데이터 재처리 필요
✅ 복잡한 워크플로우
✅ 즉시 처리가 중요한 경우
✅ RPC 패턴 구현
// 대용량 이벤트는 Kafka
kafkaTemplate.send("user-activity", event);
// 즉시 알림은 RabbitMQ
rabbitTemplate.convertAndSend("urgent.notifications", event);
| 요구사항 | 추천 도구 |
|---|---|
| 대용량 실시간 분석 | Kafka |
| 복잡한 비즈니스 로직 | RabbitMQ |
| 이벤트 소싱 | Kafka |
| 작업 큐 시스템 | RabbitMQ |
| IoT 데이터 수집 | Kafka |
| 실시간 알림 | RabbitMQ |