[RabbitMQ] 개념과 Exchange Type 알아보기

Loopy·2022년 8월 11일
post-thumbnail

1️⃣ RabbitMQ 개념

RabbitMQ는, AMQP 프로토콜을 구현한 메시지 브로커이다.
즉 생산자에게 메시지를 받아 소비자에게 전달해주는 서비스로 시스템 간 메시지를 전달해주는 오픈소스 메시지 브로커 소프트웨어이다.

📚 AMQP란?
Advanced Message Queueing Protocol의 줄임말로, MQ의 오픈소스에 기반한 표준 프로토콜. 즉, 클라이언트가 메시지 미들웨어 브로커와 통신할 수 있게 해주는 메세징 프로토콜이다.

                          Broker
Producers -> [Exchange -- Binding --> Queue] -> Consumers

☁️ AMQP 구성 요소

1. Exchange

생산자로부터 수신한 메시지를 적절한 큐나 다른 exchange로 분배하는 라우터의 기능을 한다. Exchange 는 수신한 메시지를 분배하기 위해 Exchange Type이라 하는 라우팅 알고리즘을 사용하며, 브로커는 여러개의 Exchange Type 인스턴스를 가질 수 있다.

2. Queue

메시지를 일시적으로 저장하는 저장소이다. 큐는 메모리나 디스크에 저장되기 때문에, RabbitMQ 서버가 설치되는 호스트의 메모리 및 디스크 용량에 한정된다.

Producer 들이 보낸 메시지가 큐로 오게 되고, 구독중인 여러 Consumer 들에게 전송하는 구조를 지닌다.

📚 Queue 속성
1. Name : 큐의 이름으로, amq. 로 시작하는 이름은 예약되어 사용할 수 없다.
2. Durability : durable 은 브로커가 재시작 되어도 디스크에 저장되어 남아 있고, transient 은 브로커가 재시작되면 사라진다.
3. Auto delete : 마지막 Consumer 가 구독을 끝내는 경우 자동으로 삭제된다.
4. Arguments : 메시지 TTL, Max Length 같은 추가 기능을 명시한다.

3. Binding

Exchange와 Queue와의 관계를 정의한 일종의 라우팅 테이블이다. 동일한 Queue가 여러 개의 Exchange에 바인딩 될 수도 있고, 단일 Exchange에 여러 개의 큐가 바인딩 될 수도 있다.

🛠 주의
Exchange Type 은 받은 메시지를 "어떤 방법으로 라우팅"할 지 결정하는 것이고 Binding 은 이러한 방법으로 결정된 메시지를 "어느 Queue에 전달"할 지 결정하는 라우팅 테이블

☁️ Work Queue

여러 Consumer 를 가질 수 있다.

2️⃣ Exchange Message 타입

모든 메시지는 Queue 로 직접 전달되지 않고, 반드시 Exchange 에서 먼저 받는다. 그리고 Exchange Type 과 Binding 규칙에 따라 적절한 Queue 로 전달된다.

📚 Exchange 속성
Name : Exchange 이름
Type : 메시지 전달 방식(Direct/fanout/topic/headers)
Durability : 브로커가 재시작 될 때 남아 있는지 여부(durable, transient)
Auto-delete : 마지막 Queue 연결이 해제되면 삭제

🔗 Direct Exchange

메시지의 라우팅 키를 기반으로 1:N으로 Queue에 매칭시키는 방법이다.
아래의 예시를 보자.

Q1은 orange 라는 binding key 로 연결되고, Q2는 black, green 2개의 binding key 로 연결되고 있다.

이 상황에서 만약 Exchange X로 전달된 메시지의 routing keyorange 인 경우 Q1으로 전달되고, black, green인 경우 Q2로 전달된다. 그밖에 다른 메시지는 무시된다.

🔗 Fanout Exchange

라우팅 키와 관계없이 연결된 모든 Queue에 동일한 메시지를 전달한다.

🔗 Topic Exchange

와일드카드를 이용해서 메시지를 Queue에 매칭시키는 방법이다.
즉, 라우팅 키 전체가 일치 하거나 일부 패턴과 일치하는 모든 Queue 로 메시지가 전달된다.

Topic Exchange 에서 사용하는 바인딩 키는 점(.)으로 구분된 단어를 조합해서 정의한다. * 는 단어 하나 일치, # 는 0 또는 1개 이상의 단어 일치를 의미한다.

예를 들어 바인딩 키가 *.orange.* 라면, 라우팅 키가 quick.orange.rabbit이나 lazy.orange.elephant 일때 Q1번으로 간다.

토픽 타입은 유연하다. 바인딩 키에 '#', '*'를 사용하지 않는다면 direct 처럼 작용하고, '#' 만 설정했다면 fanout 처럼 작용한다.

🔗 Headers Exchange

메시지 헤더를 통해 binding key 만을 사용하는 것보다 더 다양한 속성을 사용할 수 있다.
Header exchange를 사용하면 binding key는 무시되고, 헤더 값이 바인딩 시 지정된 값과 같은 경우에만 일치하는 것으로 간주한다.

3️⃣ STOMP Destination 종류

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-튜토리얼-톺아보기

profile
개인용으로 공부하는 공간입니다. 피드백 환영합니다 🙂

0개의 댓글