마이크로서비스 아키텍처(MSA)는 서비스 간의 결합도를 낮추기 위해 비동기 메시지 기반 통신을 적극 활용한다.
그 중심에 있는 것이 바로 메시지 브로커(Message Broker)이다.
그중 가장 많이 사용되는 두 가지 솔루션이 Apache Kafka와 RabbitMQ이다.
이번 글에서는 Kafka와 RabbitMQ의 구조, 차이점, 적용 사례를 비교하고, MSA에 어떻게 활용할 수 있는지를 정리한다.

✅ 메시지 기반 아키텍처란?
메시지 기반 아키텍처는 서비스를 직접 호출하는 것이 아니라 이벤트나 메시지를 발행하고, 필요한 서비스가 이를 구독(Subscribe) 하여 처리하는 구조이다.
이 방식은 다음과 같은 MSA의 과제를 해결한다.
- 서비스 간 강한 결합을 제거
- 비동기 처리를 통한 응답 속도 향상
- 장애 전파를 최소화
- 이벤트 기반 확장 가능
예를 들어 결제 완료 이벤트가 발생하면 주문 서비스, 배송 서비스, 알림 서비스가 이를 구독하고 각자 처리할 수 있다.
📦 Apache Kafka란?
Kafka는 대용량 데이터 처리에 최적화된 분산 스트리밍 플랫폼이다.
기본적으로 메시지를 로그 형태로 저장하고, 소비자는 자신이 필요한 메시지를 순서대로 읽어가는 구조를 가진다.
🧩 주요 특징
- 고속 처리: 초당 수십만 건 이상의 메시지를 처리 가능
- 내구성: 디스크에 메시지를 영구 저장
- 스케일 아웃: 브로커, 파티션 단위 확장 용이
- 구독 기반 소비: 다수의 컨슈머 그룹이 병렬로 처리 가능
✅ Kafka에 적합한 상황
- 이벤트 소싱 기반 아키텍처
- 대규모 실시간 로그 수집
- 데이터 파이프라인 구축
- 다수의 수신자가 동일 이벤트를 처리할 때
📮 RabbitMQ란?
RabbitMQ는 고전적인 메시지 브로커로, AMQP 프로토콜 기반의 메시지 큐 시스템이다.
발신자는 메시지를 Exchange에 전달하고, Exchange는 바인딩된 Queue로 메시지를 라우팅한다.
🧩 주요 특징
- 유연한 라우팅: Direct, Topic, Fanout 등 다양한 메시지 전달 방식
- 확실한 전달 보장: Acknowledge, 재전송, 지연 큐 등 제공
- 경량 서비스에 적합: 설정이 간단하고 빠른 구축 가능
✅ RabbitMQ에 적합한 상황
- 요청 → 응답 중심의 비동기 작업 처리
- 우선순위 큐, 지연 큐가 필요한 환경
- 빠르게 메시지를 받아 단기 저장 후 소비
- 소규모 시스템에서의 간단한 비동기 처리
🔍 Kafka vs RabbitMQ 비교
| 항목 | Kafka | RabbitMQ |
| 구조 | 로그 기반 스트리밍 | 메시지 큐 |
| 메시지 저장 | 디스크 기반, 영구 보존 | 큐 기반, 소비 후 삭제 가능 |
| 처리량 | 초당 수십만 건 | 초당 수천~수만 건 |
| 메시지 순서 | 보장 (파티션 기준) | 큐에 따라 순서 보장 가능 |
| 소비자 모델 | Pull 기반, 오프셋 저장 | Push 기반, ACK 필요 |
| 라우팅 | 제한적 (Topic 기준) | 고급 라우팅 제공 (Exchange + Queue) |
| 설치 및 운영 | 상대적으로 복잡함 | 비교적 간단함 |
| 사용 예 | 로그, 이벤트 스트리밍 | 백그라운드 작업, 알림 큐 등 |
🧠 실무에서의 선택 기준
Kafka를 선택해야 할 때
- 대규모 데이터 처리가 필요하거나, 이벤트 저장이 중요한 경우
- 여러 서비스가 동일 이벤트를 병렬 처리해야 하는 경우
- 실시간 분석, 데이터 스트림 처리 목적
RabbitMQ를 선택해야 할 때
- 메시지 즉시 처리와 응답이 중요한 백엔드 비동기 로직
- 복잡한 라우팅 또는 지연 큐, 우선순위 큐가 필요한 경우
- 설정이 간단하고 빠른 구축이 필요한 소규모 프로젝트
🛠️ Spring Boot에서의 통합 방법
Kafka 연동 예시
- yml 파일
spring:
kafka:
bootstrap-servers: localhost:9092
consumer:
group-id: my-service
- java 파일
@KafkaListener(topics = "order-events")
public void handleOrder(String message) {
// 메시지 처리 로직
}
RabbitMQ 연동 예시
- yml 파일
spring:
rabbitmq:
host: localhost
port: 5672
- java 파일
@RabbitListener(queues = "order-queue")
public void consumeOrder(String message) {
// 메시지 처리 로직
}
✅ 결론
Kafka와 RabbitMQ는 각각의 목적과 강점을 가진 메시지 브로커이다.
Kafka는 대규모 이벤트 스트리밍, 로그 저장, 복수 소비자 처리에 적합하며,
RabbitMQ는 백그라운드 작업 처리, 큐 기반 비동기 통신, 우선순위 메시징에 유리하다.
MSA 시스템에서는 이 두 가지를 용도별로 병행 사용하는 경우도 많다.
자신의 서비스 환경에 맞게 기능, 성능, 운영 복잡도 등을 고려하여 적절히 선택하는 것이 중요하다.
📌 참고한 공식 문서
'MSA' 카테고리의 다른 글
| [MSA] Sleuth, Zipkin으로 분산 추적 구현하기 (4) | 2025.07.24 |
|---|---|
| [MSA] Prometheus, Grafana로 모니터링 체계 구축하기 (0) | 2025.07.24 |
| [MSA] MSA에서 CI/CD와 무중단 배포 전략 (3) | 2025.07.24 |
| [MSA] JWT와 OAuth2로 인증 처리하는 방법 (2) | 2025.07.24 |
| [MSA] Spring Cloud Config와 Vault로 설정 통합 관리 (0) | 2025.07.23 |
| [MSA] Circuit Breaker로 장애 격리 설계 (Hystrix, Resilience4j) (2) | 2025.07.23 |
| [MSA] Eureka와 Consul로 서비스 디스커버리 구현하기 (1) | 2025.07.23 |
| [MSA] 서비스 통신 방법 비교: Feign vs RESTTemplate vs WebClient (0) | 2025.07.23 |