RabbitMQ ‐ RabbitMQ 기본 개념 - dnwls16071/Backend_Study_TIL GitHub Wiki
📚 AMQP(Advanced Message Queing Protocol)

- AMQP를 구현한 오픈소스 메시지 브로커이다.
- Producer에서 메시지를 발행하고 Consumer에서 메시지를 처리하는데 이 중간에서 브로커 역할을 한다.
📚 RabbitMQ 구성 컴포넌트 용어 정의
Producer(생산자)
- 메시지를 생성하고 RabbitMQ에 전송하는 애플리케이션
- Producer는 특정 Exchange에 메시지를 전송하고 Exchange는 메시지를 라우팅하여 큐에 배치
Exchange
- Producer로부터 받은 메시지를 큐에 전달
- Exchange 유형
Direct
: 특정 라우팅 키와 정확히 일치하는 큐에 메시지를 전송
Fanout
: 모든 큐에 메시지를 브로드캐스트
Topic
: 라우팅 키 패턴을 기반으로 메시지를 특정 큐에 전달
Headers
: 메시지 헤더 속성에 따라 메시지를 라우팅
- 메시지가 Exchange로 전송될 때 Routing Key가 함께 전달
Routing Key(라우팅 키)
- 메시지를 전송할 때 Producer가 Exchange에 전달하는 키
- Exchange는 이 Routing Key를 참고하여 어떤 큐에 메시지를 전달할지 결정
Queue(큐)
- 메시지를 일시적으로 저장하는 버퍼 역할, RabbitMQ의 큐는 FIFO 방식으로 동작하며 메시지가 소비자에게 전달될 때까지 보관
- 각 큐는 여러 Consumer가 구독할 수 있으며 메시지는 큐에 들어온 순서대로 전달
- 비동기적으로 동작하며 여러 컨슈머가 메시지를 수신할 수 있다. 단 하나의 메시지가 여러 소비자에게 중복으로 전달될 수는 없음
- 동일한 메시지를 수신하려면 Fanout Exchange 방식으로 동작해야만 함
Binding
- exchange와 큐의 관계
- 바인딩은 메시지를 라우팅할 때 어떤 조건으로 큐에 보낼지 정의하고 이를 위해 binding Key가 사용됨
- Binding Key와 Routing Key가 일치하면 해당 큐로 메시지 전달
Consumer(소비자)
- 큐에서 메시지를 가져와 처리하는 애플리케이션
- RabbitMQ는 여러 소비자에게 메시지를 로드밸런싱할 수 있다.
- Consumer는 큐에서 메시지를 받아 처리하면 메시지에 대한 확인을 브로커에 전송함
- 확인을 보내지 않으면 브로커는 메시지를 재전송하거나 설정한 다른 Consumer에게 전송한다.
Message Acknowledgment(메시지 확인)
- 메시지가 성공적으로 처리되었음을 RabbitMQ에 알리는 과정
- 소비자가 메시지를 성공적으로 처리하지 못했다면 메시지를 다시 큐에 넣어 다른 소비자가 처리하도록 할 수 있다.
Prefetch Count(프리페치 카운트)
- 소비자가 받을 수 있는 최대 메시지 수를 설정
- 한 번에 많은 양의 메시지를 처리하지 않도록 하여 소비자 성능 최적화
Virtual Host(가상 호스트)
- RabbitMQ 서버 내의 논리적인 구획으로 메시지 큐, 익스체인지, 사용자 권한 등을 구분
- 하나의 RabbitMQ 서버 내에 여러 개의 가상 호스트를 설정하여 서로 다른 애플리케이션의 메시지를 격리
Dead Letter Queue(DLQ)
- 메시지가 처리되지 못하거나 유효 기간이 지난 경우 별도의 큐로 이동하는 구조도 설정
📚 Exchange 유형에 따른 처리 흐름
[ Direct Exchange ]

- Direct Exchange는 메시지가 라우팅 키에 따라 특정 큐로 하나씩 전달되는 방식이다.
- 메시지를 발행할 때 사용하는 라우팅 키와 동일한 키로 익스체인지에 바인딩된 모든 큐에 메시지를 전달한다.
[ Topic Exchange ]
- 라우팅 키를 패턴 기반으로 정의하여 메시지를 여러 큐에 유연하게 전달할 수 있는 방식이다.
- 와일드카드 매칭을 사용하여 복잡한 라우팅도 가능하다.
[ Fanout Exchange ]
- 브로드캐스트(단일 송신자가 다수의 수신자에게 전송) 방식으로 메시지를 모든 바인딩된 큐에 전달한다.
- 한 번의 메시지 발행으로 모든 큐가 동일한 메시지를 받는다.
📚 메시지 전송 단계별 프로세스

- Producer → Broker
- Producer가 RabbitMQ Broker에 메시지를 송싱한다.
- 이 때, 메시지는 큐에 저장되며 익스체인지와 바인딩 설정에 따라 적절한 큐로 라우팅이 된다.
- Broker → Consumer
- Broker는 큐에 있는 메시지를 Consumer에게 전달한다.
- 큐에서 메시지를 가져가거나 메시지를 푸시받는 방식으로 수신
- 메시지 확인 또는 거절
- ACK : Consumer가 메시지를 성공적으로 처리한 후 Broker에게 ACK를 전송
- NACK : Consumer가 메시지 처리에 실패하거나 메시지를 거절한 후 NACK를 전송
- NACK에는 메시지를 다시 큐로 보내야 할지 또는 폐기해야 할지 설정 가능
- Producer에 응답을 보내기
- Producer가 Publisher Confirms를 활성화한 경우, Broker가 ACK 또는 NACK 결과를 Producer에게 전송
- ACK를 받은 경우 메시지가 성공적으로 소비된 것으로 간주, NACK를 받은 경우 메시지 실패를 기록하거나 재전송