RabbitMQ(AMQP 0-9-1)에서 발행자가 메시지를 보내는 대상. Kafka와 모델이 갈리는 지점이다.
핵심 — 발행자는 큐를 모른다
[Kafka] 프로듀서 → 토픽(파티션) 목적지를 직접 지정
[RabbitMQ] 발행자 → 익스체인지 → ? → 큐 목적지는 바인딩이 정한다
발행자는 익스체인지 이름과 라우팅 키(routing key, 메시지에 붙이는 문자열 꼬리표)만 지정한다. 어느 큐로 갈지는 바인딩(익스체인지와 큐를 연결하는 규칙)이 결정한다.
발행자 --routing key: order.kr.created--> [익스체인지]
├─ 바인딩 "order.*.created" → 큐 A ✓
├─ 바인딩 "order.kr.#" → 큐 B ✓
└─ 바인딩 "payment.*" → 큐 C ✗
이 간접 계층이 RabbitMQ의 강점이다 — 새 구독자를 붙일 때 발행자 코드를 한 줄도 안 고치고 바인딩만 추가하면 된다.
네 가지 종류
| 종류 | 라우팅 방식 | 쓰는 곳 |
|---|---|---|
| direct | 라우팅 키가 바인딩 키와 정확히 일치할 때만 | 작업 유형별 분배 |
| fanout | 라우팅 키를 무시하고 바인딩된 모든 큐에 복사 | 브로드캐스트·알림 |
| topic | 점(.)으로 나뉜 패턴 매칭 | 다차원 필터링 |
| headers | 라우팅 키 대신 헤더 속성으로 매칭(x-match=any 또는 all) | 조건이 복잡할 때 |
topic의 와일드카드 두 개를 정확히 구분해야 한다.
- 단어 정확히 하나
단어 0개 이상
라우팅 키: order.kr.created
order.*.created ✓ (kr 자리에 단어 하나)
order.# ✓ (뒤에 몇 단어든)
order.* ✗ (kr.created 는 두 단어)
fanout과 Kafka 컨슈머 그룹의 차이
결과는 비슷해 보이지만 시점이 다르다.
- fanout — 발행 시점에 큐마다 메시지를 복사한다 (저장이 N배)
- Kafka 그룹 — 로그는 하나. 그룹마다 자기 오프셋으로 읽을 뿐 (저장은 1배)
구독자가 늘 때 비용 곡선이 다르다는 뜻이다.
어디로도 못 가는 메시지
어떤 바인딩과도 매칭되지 않으면 메시지는 조용히 버려진다. 발행 시 mandatory 플래그를 켜면 반환받을 수 있고, alternate exchange를 지정해 받아 둘 수도 있다. 라우팅 오타가 무증상으로 넘어가는 게 이 모델의 대표적 함정이다.
면접 함정
- ❌ "RabbitMQ는 발행자가 큐를 지정한다" → 익스체인지에 보낸다.
- ❌ "topic의
*는 아무거나" → 단어 하나다. 여러 단어는#.