MSA

[MSA] Kafka vs RabbitMQ: 메시지 기반 아키텍처 완전정복

인생아 2025. 7. 23. 23:52
반응형

마이크로서비스 아키텍처(MSA)는 서비스 간의 결합도를 낮추기 위해 비동기 메시지 기반 통신을 적극 활용한다.
그 중심에 있는 것이 바로 메시지 브로커(Message Broker)이다.
그중 가장 많이 사용되는 두 가지 솔루션이 Apache KafkaRabbitMQ이다.
이번 글에서는 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 시스템에서는 이 두 가지를 용도별로 병행 사용하는 경우도 많다.
자신의 서비스 환경에 맞게 기능, 성능, 운영 복잡도 등을 고려하여 적절히 선택하는 것이 중요하다.

📌 참고한 공식 문서

 

반응형