※ 이 글은 인프런 RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기 강의를 들으면서 학습한 내용을 정리한 글입니다. 일부 내용을 인용하였으며, 문제가 될 시 인용 부분을 수정 또는 삭제하겠습니다.
AMQP란?
Advanced Message Queuing Protocol의 약자로, MQ의 오픈소스에 기반한 표준 프로토콜을 의미한다.
AMQP 특징
- 네트워크 상으로 전송되는 명령어들의 표준화
- AMQP 명세를 따르는 모든 Broker들은 똑같은 방식으로 동작
- 메시지 수신, 라우팅, 큐 관리, 메시지 전달 보장의 기능을 수행
- 서로 다른 언어, 플랫폼 간에도 동일한 방식으로 메시지를 주고받을 수 있음
- 다양한 언어별 클라이언트 라이브러리를 제공
- Java, Python, Ruby, .NET 등
RabbitMQ란?
AMQP를 구현한 오픈소스 메세지 브로커이다.
시스템 간 비동기 메시징을 가능하게 하여 서비스 간 통신을 안정적이고 효율적으로 처리할 수 있게 해준다.
메세지큐를 사용하는 이유
- 성능 향상: 병목 완화, 부하 분산
- 역할 분리: 요청에 대한 응답을 기다릴 필요가 없기 때문에 각 영역은 자신 역할에만 집중 가능
- 신뢰성: 데이터를 메모리 대신에 디스크에 저장하여 데이터 유실을 방지, 장애 복구 가능
- 확장성: 기능별로 모듈 분리 및 독립적 확장 가능
- 유연성: 다양한 exchange 유형과 라우팅 규칙을 지원
- 프로토콜 및 언어 지원: AMQP, STOMP, MQTT 등 다양한 프로토콜 및 Java, Python 등 다양한 언어별 클라이언트 라이브러리 제공
Rabbit MQ의 구조

- Producer (Publisher)
- 메시지를 생성하고 RabbitMQ에 전송
- 특정 Exchange에 메시지를 전송하고 Exchange는 메시지를 라우팅하여 큐에 배치
- Exchange
- Publisher로부터 수신한 메시지를 적절한 큐에 전달
- Exchange 유형
- Direct: Routing Key와 일치하는 모든 큐에 메시지를 전송
- Fanout: Routing Key를 무시. 모든 큐에 메시지를 브로드캐스트
- Topic: Direct 와 Fanout 의 중간으로, 라우팅 키 패턴이 일치하는 모든 큐에 메시지를 전송
- Headers: Routing Key를 무시. 메시지 헤더의 key-value 속성 쌍에 따라 메시지를 라우팅
- 메시지가 Exchange로 전송될 때, Routing Key가 함께 전달
- Routing Key는 메시지를 어떤 Queue로 보낼지 결정하기 위한 주소 정보로, 메시지를 전송할 때 Publisher가 Exchange에 전달하는 키이다.
- Exchange는 Routing Key를 보고 어떤 Queue에 메시지를 전달할지 결정한다.
- Queue
- 메시지를 일시적으로 저장하는 버퍼 역할
- Producer가 보낸 메시지를 Consumer가 수신할 때까지 보관한다.
- RabbitMQ의 Queue는 FIFO (First In, First Out) 방식으로 동작한다.
- 각 Queue는 여러 Consumer가 구독 (수신)할 수 있으며, 메시지는 비동기적으로 처리된다.
- 하나의 메시지가 여러 Consumer에게 중복으로 전달될 수 없다. -> Fanout Exchange 방식을 사용
- Binding
- Exchange와 Queue의 mapping을 담당
- 메시지를 라우팅할 때 어떤 조건으로 Queue에 보낼지 정의 -> Binding Key를 사용
- Binding Key와 Routing Key가 일치하면 해당 Queue로 메시지가 전달
- Consumer (Subscriber)
- Queue에서 메시지를 가져와서 처리
- 메시지를 정상적으로 처리한 후에 메시지에 대한 확인 응답 (ACK)를 메시지 브로커에 전송한다.
- 메시지가 성공적으로 처리되었음을 RabbitMQ에 알리는 과정
- ACK를 보내지 않으면, 브로커는 메시지를 재전송하거나 다른 Consumer에게 전달한다.
- Queue에서 메시지를 가져와서 처리
Exchange 유형
- Direct Exchange
- Routing Key에 따라 특정 Queue로 하나씩 전달하는 방식
- 하나의 Routing Key에 여러 Queue가 Binding 될 수 있기 때문에 1:1 or 1:N
- 메시지가 특정 Queue로 명확하게 전달되어야 할 때 또는 각 Queue에 고유한 라우팅 규칙을 적용하여 메시지를 분류해야 할 때 사용한다.
- ex) 주문 상태 처리, 결제 처리, 사용자 알림 시스템 등
- Fanout Exchange
- Routing Key에 관계없이 메시지를 모든 Binding된 Queue에 전달하는 브로드캐스트 방식
- 모든 Queue에 동일한 메시지를 전달한다.
- ex) 시스템 점검 공지
- Topic Exchange
- Routing Key를 패턴 기반으로 정의하여 메시지를 여러 큐에 유연하게 전달할 수 있는 방식
- *: 단어 1개 일치, log.* -> log.warn, log.error, log.info 메시지 수신 가능
- #: 단어 0개 이상 일치, order.# -> order.created, order.shipped.express 메시지 수신 가능
- Routing Key를 패턴 기반으로 정의하여 메시지를 여러 큐에 유연하게 전달할 수 있는 방식
- Headers Exchange
- 메시지의 헤더에 있는 key-value 쌍을 기반으로 라우팅하는 방식
- language: "ko" -> 한국어로 처리, language: "en" -> 영어로 처리
- ex) 다국어 서비스, 등급별 혜택 알림
'MQ' 카테고리의 다른 글
| [MQ] Dead Letter Queue와 RetryTemplate을 활용한 메시지 재처리 (3) | 2025.08.01 |
|---|---|
| [MQ] Routing Model을 이용한 Log 수집 (2) | 2025.08.01 |
| [MQ] WebSocket과 Pub/Sub을 통한 실시간 웹 알림 구현하기 (3) | 2025.07.31 |
| [MQ] 여러 Consumer에게 메시지 분산 처리하기 (2) | 2025.07.30 |
| [MQ] RabbitMQ의 기본 비동기 메시지 전송 (1) | 2025.07.30 |
