본문 바로가기

AMQP/RabbitMQ

[RabbitMQ] RabbitMQ의 이해

 

 

1. RabbitMQ 란?

AMQP를 구현한 오픈 소스 메시지 브로커 소프트웨어로 Publisher(Producer)로부터 메시지를 받아 Consumer에게 라우트하는 것이 주된 역할이다.

이를 이용하면 작업 큐, 발행 및 구독, 라우팅, 주제, 원격 프로시저 호출 등의 모델을 구현할 수 있다.

 

2. RabbitMQ component

  • Producer (Publisher)
  • Consumer
  • Queue
  • Exchange
  • Binding

Producer는 메시지를 생성하고 발송하는 주체이다. 이 메시지는 Queue에 저장이 되는데, 주의할 점은 바로 Queue에 접근하는 것이 아니라 Exchange를 통해서 Queue에 접근하게 된다.

Consumer는 메시지를 수신하는 주체이다. Consumer는 Queue에 직접 접근하여 메시지를 가져온다.

Queue는 Producer들이 발송한 메시지들이 Consumer가 소비하기 전까지 보관되는 장소이다. Queue는 이름으로 구분되는데, 같은 이름과 같은 설정으로 Queue를 생성하면 에러 없이 기존 Queue에 연결되지만, 같은 이름과 다른 설정으로 Queue를 생성하려고 시도하면 에러가 발생한다.

Exchange는 Producer들에게서 전달받은 메시지들을 어떤 Queue들에게 발송할 것인지 결정하는 객체이다.

 

3. Exchange Type

Direct Routing key가 정확히 일치하는 Queue에 메세지 전송 Unicast
Topic Routing key 패턴이 일치하는 Queue에 메세지 전송 Multicast
Headers [key:value]로 이루어진 header 값을 기준으로 일치하는 Queue에 메세지 전송 Multicast
Fanout 해당 Exchange에 등록된 모든 Queue에 메세지 전송 Broadcast

 

Direct Exchange

Direct Exchange는 라우팅 키를 이용하여 메세지를 라우팅 하는데, 하나의 큐에 여러 개의 라우팅 키를 지정할 수 있습니다.

위 그림은 error 메세지만 저장소에 기록하고, info와 warning을 포함한 모든 정보를 디스플레이에 출력할 때를 나타내는 모식도입니다. (C1 : 저장소, C2 : 디스플레이)

Direct Exchange에 여러 큐에 같은 라우팅 키를 지정하여 Fanout처럼 동작하게 할 수도 있습니다.


* RabbitMQ에는 Default Exchange(Unnamed Exchange)가 있는데, 이 Exchange는 Direct타입이며, RabbitMQ에서 생성되는 모든 Queue가 자동으로 binding됩니다. 이 때, 각 Queue의 이름이 라우팅 키로 지정됩니다.

Topic Exchange

Topic Exchange는 라우팅 키 패턴을 이용하여 메세지를 라우팅합니다.

라우팅 키가 example.orange.rabbit 인 경우 메세지가 Q1, Q2에 모두 전달되고,

라우팅 키가 example.orange.turtle 인 경우 메세지가 Q1에만 전달이 됩니다.

라우팅 키가 lazy.grape.rabbit인 경우엔 메세지가 Q2에 한 번만 전달이 됩니다. (라우팅 패턴이 여러 개 일치하더라도 하나의 큐에는 메세지가 한 번만 전달됩니다.)

Headers Exchange

Headers Exchange는 Topic Exchange와 유사하지만 라우팅을 위해 header를 쓴다는 차이점이 있습니다.

Fanout Exchange

Fanout Exchange는 exchange에 등록된 모든 queue에 메세지를 전송합니다.

 

4. Message Queue 및 Message 보존

RabbitMQ server가 종료 후 재기동하면, 기본적으로 Queue는 모두 제거됩니다. 이를 예방하기 위해서는 Queue를 생성할 때, Durable 옵션에 ture를 주고 생성해야 한다. 

또한, Producer가 메시지를 발송할 때 PERSISTANCE_TEXT_PLAIN 옵션을 주어야 메시지가 보존된다.

 

 

 

 

 

 

 

! 참고

https://ram2ram2.tistory.com/3

https://blog.dudaji.com/general/2020/05/25/rabbitmq.html

 

 

'AMQP > RabbitMQ' 카테고리의 다른 글

[RabbitMQ] 설치 및 운용 (Fast API)  (0) 2022.06.24
[RabbitMQ] RabbitMQ 설치하기. (Feat. Docker)  (0) 2022.06.11