익스체인지 → 바인딩 → 큐 구조로 메시지를 라우팅하는 브로커. AMQP 프로토콜 구현체다.
메시지가 흐르는 길
생산자 ──► [익스체인지] ──바인딩 규칙──► [큐] ──► 소비자
│
├─ routing key 로 어디에 넣을지 결정
생산자는 큐가 아니라 익스체인지에 보낸다. 어느 큐로 갈지는 익스체인지와 바인딩 규칙이 정한다 — 이 간접 계층이 유연함의 원천이다.
익스체인지 종류
| 종류 | 라우팅 방식 | 쓰임 |
|---|---|---|
| direct | 라우팅 키가 정확히 일치 | 특정 큐로 지정 전달 |
| topic | 패턴 매칭 (order.*.created) | 주제별 구독 |
| fanout | 바인딩된 모든 큐로 복제 | 브로드캐스트 |
| headers | 헤더 값으로 매칭 | 복잡한 조건 |
소비와 ack
소비자가 메시지 수신
├─ 처리 성공 → basic.ack → 큐에서 삭제
├─ 처리 실패 → basic.nack → 재전달 또는 DLQ
└─ 응답 없이 연결 끊김 → 재전달
prefetch(QoS) 로 소비자당 미확인 메시지 수를 제한한다. 이걸 안 걸면
빠른 브로커가 느린 소비자에게 메시지를 잔뜩 밀어 넣어 메모리가 터진다.
- prefetch=1 — → 하나 처리하고 ack 해야 다음 것을 받음(공평 분배) prefetch=100 → 처리량은 높지만 한 소비자에 쏠릴 수 있음
Kafka와의 근본 차이
RabbitMQ는 "브로커가 똑똑하고 소비자는 단순", Kafka는 "브로커가 단순하고 소비자가 똑똑하다".
- RabbitMQ — 브로커가 라우팅·재전달·우선순위·TTL을 다 관리한다
- Kafka — 브로커는 그냥 로그를 쌓고, 소비자가 오프셋을 관리한다
그래서 RabbitMQ는 개별 메시지 제어에 강하고, Kafka는 대량 처리량에 강하다.
언제 RabbitMQ인가
- 메시지마다 우선순위·TTL·지연 전달이 필요할 때
- 복잡한 라우팅(조건에 따라 다른 서비스로)
- 작업 큐(job queue)처럼 한 번 처리하면 끝인 일
- 재처리·이력 보관이 필요 없을 때