들어가기 앞서
최근 백엔드 개발자에게 비동기 메세지 시스템은 필수적인 기술 스택이라고 생각합니다. Kafka, RabbitMQ 등 이미 많이들 사용하고 계시거나 들어보셨을 텐데, 저는 실무에서 Kafka를 사용해 보았지만, 이미 인프라가 잘 구축되어 있어, 제가 주도적으로 구축하거나 깊이 이해하고 있지 못하고 있습니다.
그래서 앞으로 비동기 메세지 시스템에 대해 공부할 예정이며, 오늘은 RabbitMQ에 대해서 공부해 볼 예정입니다. 이번 포스팅에서는 대략적으로 RabbitMQ가 무엇인지 간단하게 개념을 알아볼 예정이며, 자세한 내용은 다른 포스팅들을 함께 참고해 주시면 감사하겠습니다.
RabbitMQ에 대해 알아보자 - (2) RabbitMQ vs Kafka
RabbitMQ에 대해 알아보자 - (3) 메시지 처리에 실패하게 된다면?
RabbitMQ에 대해 알아보자 - (4) 메시지 실패 처리 DLQ, DLX, PLQ
RabbitMQ에 대해 알아보자 - (5) Work Queue를 통한 분산처리
RabbitMQ에 대해 알아보자 - (6) Exchange 전략
RabbitMQ에 대해 알아보자 - (7) Pub-Sub 패턴 / Fanout Exchange 전략
RabbitMQ에 대해 알아보자 - (8) Routing 패턴 / Direct Exchange 전략
RabbitMQ에 대해 알아보자 - (9) Topic 패턴 / Topic Exchange 전략
RabbitMQ에 대해 알아보자 - (10) Header 기반 라우팅 / Headers Exchange 전략
RabbitMQ에 대해 알아보자 - (11) 트랜잭션 전략 / 신뢰성 있는 메시지
RabbitMQ에 대해 알아보자 - (11) Producer 트랜잭션 전략
아래 글 내용은 CharGPT 이용해서 정리한 점 양해 부탁드립니다 :)
AMQP와 RabbitMQ, 메시징의 정수
1. AMQP란 무엇인가?
AMQP(Advanced Message Queuing Protocol)는 이기종 시스템 간 메시지를 안전하고 신뢰성 있게 전달하기 위한 표준 프로토콜입니다.
과거 대부분의 메시지 큐 시스템은 특정 벤더나 플랫폼에 종속적인 구조였기 때문에, 시스템 간 메시지 교환이 매우 어려웠습니다. AMQP는 이를 극복하기 위해 다음과 같은 특징을 갖고 있습니다.
- 브로커와 클라이언트의 동작 표준화
- 네트워크 명령 구조의 통일
- 언어 및 플랫폼 독립성
- 확장성과 신뢰성을 고려한 설계
특히 AMQP는 메시지를 큐에 넣고 꺼내는 기본 구조뿐 아니라, 메시지 라우팅, 트랜잭션, 인증, 보안, 메시지 보존 등 모든 메시징 요소를 포함하는 프로토콜입니다.
2. RabbitMQ란 무엇인가?
RabbitMQ는 AMQP를 구현한 가장 대표적인 오픈소스 메시지 브로커입니다. Erlang 언어로 작성되어 동시성과 안정성에 강하며, 가볍고 다양한 운영체제에서 사용할 수 있는 장점이 있습니다.
RabbitMQ는 MSA 아키텍처에서 다음과 같은 역할을 수행합니다.
- 비동기 처리 기반의 안정적인 메시징
- 메시지의 영속성 및 장애 복구 지원
- 다양한 메시지 라우팅 전략을 통한 유연한 설계
- UI 기반 모니터링과 강력한 CLI 도구
- 다양한 프로토콜(STOMP, MQTT 등)과 언어(Java, Python, Go 등) 지원
3. AMQP의 기본 구성 요소
RabbitMQ의 메시징 구조는 다음과 같은 핵심 컴포넌트로 이루어져 있습니다.

1) Producer
메시지를 생성하여 RabbitMQ에 전달하는 주체입니다. 메시지는 특정 Exchange에 발송되며, 라우팅 키와 함께 전달됩니다.
2) Exchange
메시지를 수신하고, 라우팅 키와 바인딩 조건에 따라 적절한 Queue로 전달하는 라우터 역할을 합니다.
Exchange의 종류는 다음과 같습니다.
- Direct: 정확한 라우팅 키 매칭 (1:1 또는 1:N)
- Topic: 패턴 기반 라우팅 (와일드카드 *, # 사용)
- Fanout: 모든 바인딩된 큐에 메시지 브로드캐스트
- Headers: 메시지 헤더를 기준으로 라우팅
3) Queue
메시지를 임시 저장하는 공간입니다. FIFO 방식으로 동작하며, 메시지는 소비자에게 전달될 때까지 큐에 남아 있습니다.
하나의 큐는 여러 Consumer가 구독할 수 있으며, 메시지는 큐에 들어온 순서대로 전달 됩니다. 비동기적으로 동작하기 때문에, 여러 Consumer가 동시에 메시지를 소비할 수도 있습니다. 이럴 경우에는 하나의 메시지가 여러 소비자에게 중복으로 전달 될 수는 없어, 동일한 메시지를 여러 Consumer에서 소비하기 위해서는 Fanout Exchange 방식으로 동작해야 합니다.
4) Binding
Exchange와 Queue 사이의 연결을 의미하며, 메시지를 어떤 조건으로 라우팅할지 정의합니다. Binding Key와 Routing Key가 일치하면 메시지가 전달됩니다.
5) Routing Key
Producer가 메시지를 보낼 때 함께 지정하는 키로, Exchange가 이 키를 참고하여 라우팅합니다.
4. 메시지 전송 프로세스

- Producer가 메시지와 함께 Routing Key를 포함하여 Exchange에 전송
- Exchange는 Binding 정보를 바탕으로 메시지를 Queue로 전달
- Queue는 메시지를 소비자(Consumer)에게 전달
- Consumer는 메시지 처리 후 ACK(확인) 또는 NACK(실패) 응답을 반환
- ACK를 받은 메시지는 삭제되고, NACK는 재처리되거나 DLQ로 이동
5. Exchange 유형별 라우팅 방식 정리
RabbitMQ의 핵심 기능 중 하나는 다양한 라우팅 전략을 제공하는 Exchange다. 메시지가 어떤 기준에 따라 어떤 큐로 전달될지를 결정하는 컴포넌트로, 다음과 같은 네 가지 주요 Exchange 유형이 존재한다.
1) Direct Exchange
Direct Exchange는 메시지의 Routing Key와 Binding Key가 정확히 일치할 때, 해당 큐로만 메시지를 전달하는 방식이다.
즉, 메시지를 발행할 때 사용하는 라우팅 키가 "order.created"이면, 이 키로 바인딩된 큐만 해당 메시지를 받게 된다.
특징
메시지를 정확하게 하나의 큐 또는 여러 큐에 보내고 싶을 때 사용
1:1 또는 1:N 라우팅이 모두 가능
큐마다 명확하게 정의된 고유한 라우팅 키를 사용할 수 있음
활용 예시
주문 상태별 큐: order.placed, order.shipped, order.delivered 등
결제 성공/실패 알림
사용자 알림 메시지 분리
사용 조건
메시지가 명확하게 특정 큐로 전달되어야 할 때
각 큐마다 고유한 라우팅 규칙이 필요한 경우
2) Topic Exchange
Topic Exchange는 Routing Key의 패턴 기반 매칭을 통해 메시지를 여러 큐로 유연하게 라우팅하는 방식이다. 라우팅 키에는 와일드카드 문자를 사용할 수 있다.
와일드카드 종류
* : 정확히 하나의 단어를 대체
# : 0개 이상의 단어를 대체
예시
메시지 키: log.info, log.warn, log.error
바인딩 키: log.* → 모든 로그 유형 수신 가능
메시지 키: app.order.success, app.payment.success
바인딩 키: #.success → 모든 성공 이벤트 수신
활용 예시
로그 수집 시스템: log.*
이벤트 기반 모니터링: app.#, event.payment.*
사용 조건
패턴 기반의 동적 라우팅이 필요할 때
메시지 종류가 많고, 이를 유연하게 필터링하고 싶을 때
3) Fanout Exchange
Fanout Exchange는 메시지를 모든 바인딩된 큐에 브로드캐스트 방식으로 전달한다. 라우팅 키는 무시되며, 단순히 해당 Exchange에 연결된 모든 큐로 메시지를 복사해 전송한다.
특징
라우팅 키가 전혀 사용되지 않음
모든 큐가 동일한 메시지를 받음
다중 수신자 전파 구조에서 강력
활용 예시
시스템 점검/공지 브로드캐스트
이벤트 발생 시 여러 서비스에 알림
웹소켓 기반 멀티 유저 실시간 알림
사용 조건
동일 메시지를 여러 서비스가 동시에 받아야 할 때
전체 전파가 필요한 시스템
4) Headers Exchange
Headers Exchange는 메시지의 헤더 속성에 따라 큐로 라우팅하는 방식이다. Routing Key가 아닌, 헤더 필드의 key-value 조건을 기준으로 라우팅된다.
예시 헤더
language: ko → 한국어 전용 서비스
user-grade: premium → 프리미엄 등급 사용자 전용 큐
활용 예시
다국어 이메일 알림 시스템
고객 등급별 이벤트 메시지 분류
커스텀 속성 기반 라우팅 필요할 때
사용 조건
라우팅 기준이 메시지 본문/키가 아닌, 속성 정보일 때
복잡한 사용자 조건을 기반으로 메시지를 분기하고 싶을 때
6. RabbitMQ 관련 용어
Message Acknowledgment
Consumer가 메시지를 정상적으로 처리했을 경우 ACK를 브로커에 보내며, 그렇지 않은 경우 NACK를 보냅니다. 이 때 메시지를 재전송할지 폐기할지 설정 가능합니다.
Prefetch Count
한 번에 소비자가 받을 수 있는 최대 메시지 수를 제한하여 처리량을 제어합니다.
Virtual Host (vHost)
RabbitMQ 서버 내의 논리적인 구획으로 메시지 큐, 익스체이지, 사용자 권한 등을 구분합니다. 하나의 RabbitMQ 서버 내에 여러 개의 가상 호스트를 설정하여 서로 다른 애플리케이션의 메시지를 격리 할 수 있습니다.
Dead Letter Queue (DLQ)
처리 실패 메시지, 유효기간 만료 메시지 등을 별도 큐에 모아 장애 분석 및 후처리에 활용할 수 있습니다.
'Kafka, RabbitMQ' 카테고리의 다른 글
| RabbitMQ에 대해 알아보자 - (6) Exchange 전략 (0) | 2025.05.05 |
|---|---|
| RabbitMQ에 대해 알아보자 - (5) Work Queue를 통한 분산처리 (0) | 2025.05.03 |
| RabbitMQ에 대해 알아보자 - (4) 메시지 실패 처리 DLQ, DLX, PLQ (0) | 2025.04.30 |
| RabbitMQ에 대해 알아보자 - (3) 메시지 처리에 실패하게 된다면? (0) | 2025.04.30 |
| RabbitMQ에 대해 알아보자 - (2) RabbitMQ vs Kafka (0) | 2025.04.30 |