메시지 큐(Message Queue)를 사용하는 이유와 Kafka, RabbitMQ의 차이를 설명해주세요.
답변 포인트
비동기 처리, 트래픽 완충, 이벤트 스트리밍과 작업 큐의 차이를 떠올려보세요.
정답 및 해설
빠른 요약
메시지 큐는 서비스 간 작업을 메시지로 전달해 비동기 처리, 장애 격리, 트래픽 완충, 결합도 감소를 얻기 위해 사용합니다. Kafka는 로그 기반 이벤트 스트리밍 플랫폼으로 대용량 처리, 이벤트 재처리, 데이터 파이프라인에 강합니다.
메시지 큐는 서비스 간 작업을 직접 호출하지 않고 메시지로 전달하게 해주는 미들웨어입니다. 이를 통해 비동기 처리, 장애 격리, 트래픽 완충, 서비스 간 결합도 감소를 얻을 수 있습니다.
왜 메시지 큐를 사용하나요?
예를 들어 주문 생성 후 결제, 재고 차감, 알림 발송을 모두 동기 호출로 처리하면 하나의 서비스 지연이나 장애가 전체 응답을 늦춥니다.
Order API -> Payment API -> Inventory API -> Notification API메시지 큐를 사용하면 주문 서비스는 이벤트를 발행하고, 각 서비스가 독립적으로 처리할 수 있습니다.
Order Service -> order.created -> Queue/Broker
-> Payment Service
-> Inventory Service
-> Notification Service장점
- 비동기 처리로 응답 시간 단축
- 일시적인 트래픽 폭주를 큐가 완충
- 소비자 장애 시 메시지를 보관했다가 재처리 가능
- 서비스 간 직접 의존성 감소
- 이벤트 기반 아키텍처 구현 가능
주의할 점
메시지 큐를 쓰면 시스템은 더 유연해지지만 복잡도도 증가합니다.
- 메시지 중복 처리 가능성
- 처리 순서 보장 범위
- 재시도와 Dead Letter Queue 설계
- 이벤트 스키마 변경 관리
- 최종적 일관성 이해 필요
Kafka
Kafka는 대용량 이벤트 스트리밍에 강한 로그 기반 메시지 플랫폼입니다.
특징:
- 토픽을 파티션으로 나눠 높은 처리량 제공
- 메시지를 일정 기간 저장
- Consumer Group 단위로 병렬 소비
- 같은 파티션 내 순서 보장
- 이벤트 재처리와 스트림 처리에 적합
topic: order-events
partition-0: [event1, event2, event3]
partition-1: [event4, event5, event6]적합한 경우:
- 로그 수집
- 클릭스트림 처리
- 이벤트 소싱
- 대규모 데이터 파이프라인
- 여러 소비자가 같은 이벤트를 독립적으로 읽어야 하는 경우
RabbitMQ
RabbitMQ는 전통적인 메시지 브로커로, 라우팅과 작업 큐 패턴에 강합니다.
특징:
- Exchange와 Queue 기반 라우팅
- 다양한 라우팅 패턴 지원
- 메시지 acknowledgement 기반 안정적 처리
- 작업 분배와 RPC 패턴에 적합
Producer -> Exchange -> Queue -> Consumer적합한 경우:
- 백그라운드 작업 큐
- 이메일 발송
- 이미지 처리
- 복잡한 라우팅 규칙이 필요한 업무 메시징
Kafka vs RabbitMQ
| 구분 | Kafka | RabbitMQ |
|---|---|---|
| 중심 모델 | 로그/스트림 | 큐/라우팅 |
| 강점 | 대용량 처리, 재처리, 이벤트 스트림 | 유연한 라우팅, 작업 큐 |
| 메시지 보관 | 일정 기간 저장 | 소비 후 제거가 일반적 |
| 순서 보장 | 파티션 단위 | 큐 단위 |
| 대표 용도 | 이벤트 파이프라인 | 비동기 작업 처리 |
정리
메시지 큐는 비동기 처리와 서비스 결합도 완화에 유용하지만, 중복 처리와 최종적 일관성을 반드시 설계해야 합니다. 대용량 이벤트 스트리밍은 Kafka, 업무 메시징과 작업 큐는 RabbitMQ가 자주 선택됩니다.
메시지 큐를 도입하는 이유
메시지 큐는 요청 처리와 후속 작업을 분리해 시스템을 느슨하게 연결합니다. 주문 생성 후 이메일 발송, 이미지 변환, 로그 수집처럼 즉시 응답에 포함하지 않아도 되는 작업을 비동기로 처리할 수 있습니다.
API 서버 → order.created 메시지 → 소비자(메일, 포인트, 분석)Kafka와 RabbitMQ 비교
| 항목 | Kafka | RabbitMQ |
|---|---|---|
| 핵심 모델 | 분산 로그/스트림 | 메시지 브로커/큐 |
| 강점 | 높은 처리량, 이벤트 재처리, 스트리밍 | 라우팅, 작업 큐, 다양한 exchange |
| 메시지 보관 | 일정 기간 보관 후 소비 위치(offset) 관리 | 소비 후 ack되면 제거되는 방식이 일반적 |
| 적합한 예 | 로그, 클릭스트림, 이벤트 소싱 | 작업 분배, 이메일 발송, RPC 비슷한 패턴 |
실무 주의사항
- 메시지는 중복 처리될 수 있으므로 소비자는 idempotent하게 만들어야 합니다.
- 순서 보장이 필요한 단위는 partition key 또는 queue 설계를 명확히 해야 합니다.
- 실패 메시지는 재시도 정책과 DLQ(Dead Letter Queue)를 둡니다.
- 메시지 스키마 변경은 생산자/소비자 배포 순서를 고려합니다.