[MQ] RabbitMQ 란?
Programming

[MQ] RabbitMQ 란?

728x90

RabbitMQ는 쉽고 간편하면서  AMQP를 구현한 오픈소스 메시지 브로커(Message Broker) 입니다.

 

메시지 브로커(Message Broker)란?

메시지 브로커는 sender application이 발송한 메시지를 receiver application에게 전달해주는 툴입니다. 메시지 브로커는 메시지를 전달하면 메시지를 보관하지 않고 삭제합니다.

 

AMQP(Advanced Message Queuing Protocol)란?

메시지 지향 미들웨어를 위한 표준 응용 계층 프로토콜입니다. 탄생 배경은 AMQP이전에 상용화된 MQ는 플랫폼에 종속적인 경우가 많았었기 때문에 다른 이기종간에 메시지를 교환하기 위해서는 메시지 브릿지를 사용하거나 (성능 저하 이슈), 시스템 자체를 통일 시켜야하는 (대공사) 불편함과 비효율성이 있었습니다. 따라서 서로 다른 시스템간에 최대한 효율적인 방법으로 메시지 교환을 하기위해 등장한 프로토콜이 바로 AMQP입니다.

 

언제 사용하나요?

  • 많은 작업이 요청되어 처리해야할 때
  • 하나의 요청을 많은 사용자에게 전달해야할 때
  • 요청에 대한 처리시간이 길때

주요 개념

  • Producer: 요청을 보내는 주체입니다. Exchange에 메시지를 publish 합니다.
  • Consumer: 최종적으로 메시지를 받는 주체입니다. queue로 부터 메시지를 받습니다.
  • Exchange: producer로 부터 받은 메시지를 어떤 queue로 보낼지 결정하는 곳입니다.
  • Queue: exchange로 부터 메시지를 받고, consumer에게 순차적으로 메시지를 보냅니다.
  • Binding: Exchange와 Queue의 연결관계입니다. 보통 사용자가 직접 특정 exchange가 특정 queue에 binding 되도록 정의합니다.
  • RoutingKey: queue와 exchange 간 연결을 위해 사용되는 키 입니다.

Exchange의 종류

Exchange에는 크게 4가지 타입이 있습니다.

  • Fanout: 하나의 메시지를 모든 queue에 동일하게 전송합니다. 메이플스토리 전체서버 확성기와 비슷합니다.
  • Direct: RoutingKey를 기반으로 queue에 메시지를 전달합니다. (routingKey값이 queue와 exchange간 정확히 일치해야합니다. 
  • Topic: Direct와 비슷하지만 '*', '#'과 같이 routingKey를 패턴으로 전달하여 일부패턴이 routingKey와 일치하는 queue에 발송합니다.
  • Headers: 헤더와 key-value 값을 보고 매칭되는 queue에 메시지를 전달합니다.

 

1. Fanout Exchange

Exchange와 Binding된 모든 Queue에 동일한 메시지를 보냅니다.

 

2. Direct Exchange

Routing key가 정확히 일치하는 queue에 메시지를 보냅니다.

여러개의 Queue에 같은 Routing Key를 지정할 수도 있고

하나의 Queue에 여러개의 Routing Key를 지정할 수도 있습니다.

 

3. Topic Exchange

Routing key 패턴이 일치하는 Queue에 메시지를 전송합니다.

단어는 점(.) 으로 구분되며 '*' 는 하나의 단어를 뜻하고, '#'는 없거나 하나이상의 단어를 뜻하는 패턴입니다.

 

예시

  • aaa.aaa.rabbit -> Q2 로 메시지가 전송됩니다
  • bbb.bbb.bbb.rabbit -> binding 되는 Queue가 존재하지 않습니다.
  • lazy.ccc.ccc.ccc -> Q2로 메시지가 전송됩니다

 

4. Headers Exchange

key-value 로 정의된 헤더로 Queue와 binding하여 메시지를 전달하는 방법입니다.

producer에서 정의하는 header의 key-value와 consumer에서 정의된 argument의 key-value가 일치하면 binding 됩니다.

또한 헤더에는 x-match라는 key가 있는데 직관적으로 알 수 있듯

x-match: all 은 모든 key-value가 정확히 일치해야 Queue와 binding되고

x-match: any는 header의 key-value 값과 argument의 key-value값 중 하나만 일치해도 binding 됩니다.

 

출처:
- RabbitMQ란?
- AMQP Introduction
728x90