[RabbitMQ] 기본 개념

sinryuji·2025년 3월 10일

1. RabbitMQ란?

RabbitMQ는 AMQP(Advanced Message Queuing Protocol)를 구현한 메세지 브로커입니다.

💡 AMQP란?

AMQP는 Advanced Message Queuing Protocol의 약자로 이름 그대로 알 수 있듯이 메세지 큐(Message Queue, MQ) 프로토콜입니다. 메세지 기반 송수신을 위한 표준 프로토콜 중 하나로, 대표적으로 AMQP, MQTT, CoAP, STOMP 등이 있고 AMQP는 이 중 메세지 지향 미들웨어(Message Oriented Middleware, MOM)들을 위한 프로토콜입니다.

AMQP가 MOM을 위한 프로토콜이고, RabbitMQ가 이를 구현하고 있다는 것은 RabbitMQ 역시 MOM의 일종이라는 뜻입니다.

그럼 RabbitMQ를 비롯한 MOM들의 사용 이점은 무엇이 있을까요?

  1. 비동기 처리(Asynchronous)
    • 작업을 큐에 넣어 비동기로 처리할 수 있습니다. 이를 통해 서비스 간의 결합도와 장애 전파를 줄이고 시스템의 응답성을 높일 수 있습니다.
  2. 부하 분산(Load Balancing)
    • 메세지를 여러 수신자에게 적절히 분산함으로써 시스템의 부하를 균형있게 분산할 수 있습니다.
  3. 내결함성(Fault Tolerance)
    • 시스템의 단일 장애가 전체 장애로 전파되지 않고 전체적인 기능을 유지할 수 있고, 메세지를 저장하여 시스템 장애 시 데이터 손실을 방지할 수 있습니다.

2. RabbitMQ의 구조

출처: https://www.cloudamqp.com/img/blog/exchanges-topic-fanout-direct.png

RabbitMQ의 구성 요소로는 Producer, Consumer, Exchange, Binding, Queue가 있습니다. 하나씩 알아봅시다.

  • Producer
    • 메세지를 생성하고 publish하는 주체입니다. 보내고자 하는 메세지를 Exchange에게 pubish 합니다. 여기서 눈여겨보아야 할 점이 메세지를 바로 Queue에 넣는 것이 아니라 Exchange에게 pubish 한다는 점입니다.
  • Consumer
    • Queue에서 메세지를 받아 처리하는 역할을 합니다.
  • Exchange
    • Producer가 publish한 메세지를 적절한 Queue에 라우팅하는 역할을 합니다. 4가지 타입(Direct, Topic, Headers, Fanout)이 있습니다.
  • Binding
    • ExchangeQueue를 있는 통로 역할을 합니다. Exchange의 타입과 Binding 규칙에 의해 메세지가 적절한 Queue로 전달됩니다.
  • Queue
    • 메세지가 저장되는 장소로 Consumer들이 Queue로 부터 메세지들을 읽어들입니다.

2.1 Exchange Type

  • Direct Exchange
    • 메세지의 routing key를 기반으로 메세지를 라우팅합니다. 여러 큐에 같은 키를 지정할 수 있고, 키와 일치하는 모든 큐에 메세지를 보냅니다.
  • Topic Exchange
    • 메세지의 routing key의 패턴을 기반으로 메세지를 라우팅합니다. Direct Exchange와 달리 키와 일치하는 큐 뿐만 아니라, 패턴에 일치하는 큐에도 메세지를 할당합니다.
      예를 들어 큐 A의 바인딩 규칙이 order.#이고 큐 B의 바인딩 규칙은 order.product.* 라고 한다면, 키가 order.example의 경우에는 큐 A에만 할당이 되고, order.product.example의 경우에는 두 큐에 모두 할당 됩니다. #은 0개 혹은 여러 단어를 대체하고, *은 정확히 하나의 단어만 대체합니다.
  • Headers Exchange
    • routing key가 아니라 메세지 header의 다양한 속성들을 이용해 라우팅합니다.
      x-match 속성을 사용해서 AND나 OR 조건을 설정하여 사용합니다. "x-match": "all"의 경우 모든 조건을 만족해야(AND) 큐에 전달하고 "x-match": "any"의 경우 하나만 만족해도(OR) 큐로 전달합니다.
      예를 들어 '{"type":"pdf", "format":"A4", "x-match":"all"}' 속성을 이와 같이 전달하면 type이 pdf이면서 format이 A4일 경우에만 큐에 전달하지만, '{"type":"pdf", "format":"A4", "x-match":"all"}'의 경우에는 type이 pdf거나 format이 A4거나 둘 중 하나만 만족해도 큐에 전달합니다.
  • Fanout Exchange
    • routing key와 상관없이 연결된 모든 큐에 메세지를 라우팅합니다. WebSocket의 Broadcast 방식을 생각하면 됩니다.
profile
응애 개발자입니다.

0개의 댓글