RabbitMQ는, AMQP 프로토콜을 구현한 메시지 브로커이다.
즉 생산자에게 메시지를 받아 소비자에게 전달해주는 서비스로 시스템 간 메시지를 전달해주는 오픈소스 메시지 브로커 소프트웨어이다.
📚 AMQP란?
Advanced Message Queueing Protocol의 줄임말로,MQ의 오픈소스에 기반한 표준 프로토콜. 즉, 클라이언트가 메시지 미들웨어 브로커와 통신할 수 있게 해주는 메세징 프로토콜이다.Broker Producers -> [Exchange -- Binding --> Queue] -> Consumers

생산자로부터 수신한 메시지를 적절한 큐나 다른 exchange로 분배하는 라우터의 기능을 한다. Exchange 는 수신한 메시지를 분배하기 위해 Exchange Type이라 하는 라우팅 알고리즘을 사용하며, 브로커는 여러개의 Exchange Type 인스턴스를 가질 수 있다.
메시지를 일시적으로 저장하는 저장소이다. 큐는 메모리나 디스크에 저장되기 때문에, RabbitMQ 서버가 설치되는 호스트의 메모리 및 디스크 용량에 한정된다.
Producer 들이 보낸 메시지가 큐로 오게 되고, 구독중인 여러 Consumer 들에게 전송하는 구조를 지닌다.
📚 Queue 속성
1.Name: 큐의 이름으로,amq.로 시작하는 이름은 예약되어 사용할 수 없다.
2.Durability:durable은 브로커가 재시작 되어도 디스크에 저장되어 남아 있고,transient은 브로커가 재시작되면 사라진다.
3.Auto delete: 마지막Consumer가 구독을 끝내는 경우 자동으로 삭제된다.
4.Arguments: 메시지TTL,Max Length같은 추가 기능을 명시한다.
Exchange와 Queue와의 관계를 정의한 일종의 라우팅 테이블이다. 동일한 Queue가 여러 개의 Exchange에 바인딩 될 수도 있고, 단일 Exchange에 여러 개의 큐가 바인딩 될 수도 있다.
🛠 주의
Exchange Type은 받은 메시지를 "어떤 방법으로 라우팅"할 지 결정하는 것이고Binding은 이러한 방법으로 결정된 메시지를 "어느 Queue에 전달"할 지 결정하는 라우팅 테이블
여러 Consumer 를 가질 수 있다.
모든 메시지는 Queue 로 직접 전달되지 않고, 반드시 Exchange 에서 먼저 받는다. 그리고 Exchange Type 과 Binding 규칙에 따라 적절한 Queue 로 전달된다.
📚 Exchange 속성
Name: Exchange 이름
Type: 메시지 전달 방식(Direct/fanout/topic/headers)
Durability: 브로커가 재시작 될 때 남아 있는지 여부(durable, transient)
Auto-delete: 마지막 Queue 연결이 해제되면 삭제
메시지의 라우팅 키를 기반으로 1:N으로 Queue에 매칭시키는 방법이다.
아래의 예시를 보자.

Q1은 orange 라는 binding key 로 연결되고, Q2는 black, green 2개의 binding key 로 연결되고 있다.
이 상황에서 만약 Exchange X로 전달된 메시지의 routing key가 orange 인 경우 Q1으로 전달되고, black, green인 경우 Q2로 전달된다. 그밖에 다른 메시지는 무시된다.
라우팅 키와 관계없이 연결된 모든 Queue에 동일한 메시지를 전달한다.
와일드카드를 이용해서 메시지를 Queue에 매칭시키는 방법이다.
즉, 라우팅 키 전체가 일치 하거나 일부 패턴과 일치하는 모든 Queue 로 메시지가 전달된다.
Topic Exchange 에서 사용하는 바인딩 키는 점(.)으로 구분된 단어를 조합해서 정의한다. * 는 단어 하나 일치, # 는 0 또는 1개 이상의 단어 일치를 의미한다.

예를 들어 바인딩 키가 *.orange.* 라면, 라우팅 키가 quick.orange.rabbit이나 lazy.orange.elephant 일때 Q1번으로 간다.
토픽 타입은 유연하다. 바인딩 키에 '#', '*'를 사용하지 않는다면 direct 처럼 작용하고, '#' 만 설정했다면 fanout 처럼 작용한다.
메시지 헤더를 통해 binding key 만을 사용하는 것보다 더 다양한 속성을 사용할 수 있다.
Header exchange를 사용하면 binding key는 무시되고, 헤더 값이 바인딩 시 지정된 값과 같은 경우에만 일치하는 것으로 간주한다.
1) /exchange
SUBSCRIBE - 임의의 바인딩 패턴으로 구독
SEND - 임의의 라우팅키와 함께 전송
2) /queue
SUBSCRIBE - STOMP에서 관리하는 Queue 구독
SEND - STOMP에서 관리하는 Queue로 전송
3) /amq/queue
SUBSCRIBE - STOMP gateway 바깥에서 만들어진 Queue 구독
SEND - STOMP gateway 바깥에서 만들어진 Queue로 전송
4) /topic
SUBSCRIBE - 일시적이고 지속되는 topic으로 구독
SEND - 일시적이고 지속되는 topic으로 전송
5) /temp-queue
SUBSCRIBE - 안함
SEND - 안함
1) destination을 /queue/<name>으로 설정하면 메세지는 default exchange로 발행된다.
2) destination을 /topic/<routing_key>로 설정하면 메세지는 'amq.topic'이라는 exchange로 발행된다.
3) 나머지 destination에 대해 /exchange/<exchange_name>/[routing_key]의 exchange로 메세지가 발행된다.
참고 자료
https://jonnung.dev/rabbitmq/2019/02/06/about-amqp-implementtation-of-rabbitmq/
https://brownbears.tistory.com/508
https://velog.io/@hoonki/RabbitMQ-튜토리얼-톺아보기