| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- docker
- Spring Container
- MSA
- redis
- @ComponentScan
- 페이징
- JWT
- 지연 로딩
- securitycontextholderfilter
- JdbcTemplate
- 컨테이너
- @Transactional
- 스프링 부트
- Routing Key
- CORS
- docker compose
- Spring Data JPA
- 쿠버네티스
- kafka
- Spring
- JPA
- Web
- Dead Letter Queue
- dockerhub
- DLQ
- AWS
- mybatis
- JPQL
- 서블릿 컨테이너
- DI
- Today
- Total
look-forest
RabbitMQ 개요와 주요 용어 본문
개요
RabbitMQ는 메시지 브로커이다.
애플리케이션 사이에서 메시지를 받아서 적절한 Queue로 라우팅하고 Consumer에게 전달하는 중간 서버이다.
시스템 간 비동기 메시징을 가능하게 하여 서비스 간 통신을 안정적이고 효율적으로 처리할 수 있게 해준다.
최근 MSA 환경에서 가장 일반적으로 쓰이는 기술 중 하나이며, 대량의 데이터 전송 시 발생할 수 있는 과부화를 분산시키며
비동기 처리와 지연이 필요한 작업을 효과적으로 관리해 줄 수 있다.
클러스터를 설정할 때 큐를 HA(High Available)로 설정하여 여러 노드에 저정함으로써 메시지 손실을 방지하고, Federation 플러그인을 통해 데이터 동기화와 다중 마스터 복제를 구성할 수도 있다.
메세지큐를 사용하는 이유
- 비동기 메시지를 사용하여 다른 응용프로그램 사이에 데이터를 송수신하기 위해
- 클라이언트에 대한 동기 처리는 병목의 요인이므로, 비동기로 처리해도 될 영역에 대해서는 큐를 통해 분리해서 처리한다.
- 요청에 대한 응답을 기다릴 필요가 없기 때문에 각 영역의 역할만 신경쓰면 된다
- 결국 분산환경에서 응용프로그램들을 분리하고 독립적으로 확장하기 위해서 사용, 기능 별로 모듈 구성이 용이
대표적인 도메인 활용 사례
- EDA(Event-Driven Architecture) : 주문/결제/배송 등의 비즈니스 도메인을 이벤트 기반의 독립적인 도메인 모듈로 구성
- 로그 및 모니터링 : 로그 수집 및 준 실시간 처리 모니터링 시스템 구축
- 채팅 및 알람 등 Notification 시스템
- 비동기 데이터 처리 : 대용량의 이미지나 비디오 처리에 효율적인 분산 시스템 구축 가능
- 여러 디바이스의 요청 처리 : IoT와 같은 멀티 디바이스 환경에서의 요청 처리
Kafka와 RabbitMQ의 차이
설계 철학 자체가 다르고, 적용 영역이 다르다.
- Kafka는 “대량 데이터 스트리밍”에 최적화된 구조 (고속 로그 저장 + 병렬 소비가 목표)
- RabbitMQ는 “정교한 라우팅”에 최적화된 구조 (메시지 분기가 목표)
Kafka는 대규모 이벤트 스트리밍 플랫폼에 적합하고, RabbitMQ는 정교한 메시지 브로커 역할에 적합하다.
모든 문제가 “대용량 이벤트 스트리밍”은 아니다.
- 이메일 발송 작업 분배
- 주문 처리 비동기화
- 이미지 변환 작업 큐
- RPC 기반 요청-응답 처리
이런 건 RabbitMQ가 더 직관적이고 단순하다.
Kafka와의 비교
| RabbitMQ | Kafka | |
| 설계 목표 | 메시지 전달 | 로그 저장 |
| 메시지 모델 | 큐 기반 | 로그 스트림 기반(메시지를 지우지않고 로그에 쌓음) |
| 메시지 삭제 | 소비 후 삭제 | 보관 기간 유지 |
| 실시간 스트리밍 | 약함 (메시지 단위 관리 오버헤드) | 강함 (파티션 단위 병렬 확장) |
| 복잡한 라우팅 | 강함 (Exchange 기반 강력) | 약함 (Routing key 없음) |
AMQP의 이해
AMQP(Advanced Message Queuing Protocol)
AMQP는 RabbitMQ가 대표적으로 사용하는 프로토콜로, (Kafka는 자체 프로토콜 사용)
메시지 브로커와 애플리케이션이 통신하기 위한 표준 메시징 프로토콜이다.
AMQP는 통신 규약이고, RabbitMQ는 그 약속을 구현한 제품이다.
AMQP의 목적은 서로 다른 시스템 간에 (비용/기술/시간적인 측면에서) 최대한 효율적인 방법으로 메시지를 교환하기 위한 MQ 프로토콜이기 때문에 아래와 같은 특징이 있다.
- 모든 broker들은 똑같은 방식으로 동작할 것
- 모든 client들은 똑같은 방식으로 동작할 것
- 네트웍상으로 전송되는 명령어들의 표준화
- 프로그래밍 언어 중립적

Routing Model Components
AMQP의 라우팅 모델은 3개의 중요한 component 들로 구성된다.
- Exchange : Publisher로부터 수신한 메시지를 적절한 큐 또는 다른 exchange로 분배하는 라우터의 기능을 한다.
- Queue : 일반적으로 알고 있는 큐이다. 메모리나 디스크에 메시지를 저장하고, 그것을 consumer에게 전달하는 역할을 한다.
- Binding : exchange와 큐와의 관계를 정의한 일종의 라우팅 테이블이다.
같은 큐가 여러 개의 exchange에 bind 될 수도 있고, 하나의 exchange에 여러 개의 큐가 binding 될 수 도 있다.

주요 용어 정리

주요 개념
1. Producer
- 메시지를 생성하고 RabbitMQ에 전송하는 애플리케이션
- Producer는 특정 Exchange에 메시지를 전송하고 Exchange는 메시지를 라우팅하여 큐에 배치
2. Exchange
- Producer로부터 받은 메시지를 큐에 전달
- Exchange 유형
- Direct: 특정 라우팅 키와 정확히 일치하는 큐에 메시지를 전송
- Fanout: 모든 큐에 메시지를 브로드캐스트
- Topic: 라우팅 키 패턴을 기반으로 메시지를 특정 큐에 전달
- Headers: 메시지 헤더 속성에 따라 메시지를 라우팅
3. Routing Key
- 메시지를 전송할 때 Producer가 Exchange에 전달하는 키
- Exchange는 이 Routing Key를 참고하여 어떤 큐에 메시지를 전달할지 결정
4. Queue
- 메시지를 일시적으로 저장하는 버퍼 역할
- RabbitMQ의 큐는 FIFO(First In, First Out) 방식으로 동작하며, 메시지가 소비자에게 전달될 때까지 보관
- 각 큐는 여러 Consumer가 구독(수신)할 수 있으며, 메시지는 큐에 들어온 순서대로 전달
- 비동기적으로 동작하며, 여러 컨슈머가 동시에 메시지를 소비할 수 있다.
- 단, 하나의 메시지가 여러 소비자에게 중복으로 전달될수는 없다.
(동일한 메시지를 수신하려면 Fanout Exchange 방식으로 동작해야 함)
5. Binding
- Exchange와 큐간의 관계를 정의, 일종의 라우팅 테이블
- 바인딩은 메시지를 라우팅할 때 어떤 조건으로 큐에 보낼지 정의하고 이를 위해 Binding key가 사용됨
- Binding Key와 Routing Key가 일치하면 해당 큐로 메시지가 전달 (패턴 매칭 가능)
6. Consumer
- 큐에서 메시지를 가져와 처리하는 애플리케이션
- RabbitMQ는 여러 소비자에게 메시지를 로드 밸런싱 할 수 있다
- Consumer는 큐에서 메시지를 받아 처리하면 메시지에 대한 확인(ACK, acknowledgment)을 브로커에 전송
- 확인을 보내지 않으면, 브로커는 메시지를 재전송하거나 설정한 다른 Consumer에게 전달할 수 있다
7. Message Acknowledgment (메시지 확인)
- 메시지가 성공적으로 처리되었음을 RabbitMQ에 알리는 과정
- 만약 소비자가 메시지를 성공적으로 처리하지 못했다면, 메시지를 다시 큐에 넣어 다른 소비자가 처리하도록 할 수 있다.
주요 프로세스

- Producer가 메시지와 Routing Key를 Exchange에 전송
- Exchange가 Routing Key를 이용해 Binding Key가 일치하는 큐에 메시지 라우팅
- Consumer가 큐에서 메시지를 가져와 처리하고, 성공적으로 처리되었음음 acknowledgment로 RabbitMQ에게 알림
추가로 알아야 할 용어
1. Prefetch Count
- 소비자가 받을 수 있는 최대 메시지 수를 설정
- 한 번에 많은 양의 메시지를 처리하지 않도록 하여 소비자의 성능 최적화
2. Virtual Host
- RabbitMQ 서버 내의 논리적인 구획으로, 사용자 권한 관리와 리소스를 격리하는데 사용.
여러 애플리케이션이 독립적으로 RabbitMQ를 이용할 수 있게 해준다. (멀티태넌시 전략처럼) - 하나의 RabbitMQ 서버 내에 여러 개의 가상 호스트를 설정하여 서로 다른 애플리케이션의 메시지를 격리할 수 있다.
3. Dead Letter Queue (DLQ)
- 메시지가 처리되지 못하거나 유효 기간이 지난 경우 별도의 큐로 이동하는 구조도 설정할 수 있다
참고 자료 & 이미지 출처
RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기
'Middleware > RabbitMQ (메시지 브로커)' 카테고리의 다른 글
| Dead Letter Queue 재처리와 Retry (0) | 2026.03.13 |
|---|---|
| Routing Model을 이용한 Log 수집 (0) | 2026.02.22 |
| Pub/Sub 모델을 이용한 실시간 알림과 뉴스 구독 (WebSocket, STOMP 활용) (0) | 2026.02.22 |
| 경쟁 소비자 패턴(Work Queue 모델)과 큐의 메시지 상태 (0) | 2026.02.17 |
| Exchange의 이해와 기본 비동기 메시지 전송 (0) | 2026.02.17 |