반응형

RabbitMQ란?

  • RabbitMQ는 AMQP를 따르는 오픈소스 메세지 브로커
  • AMQP는 클라이언트가 메시지 미들웨어 브로커와 통신할 수 있게 해주는 메세징 프로토콜
  • 주요 개념으로 Producer, Exchange, Binding, Queue, Consumer가 있음
  • Exchange, Binding, Queue는 Broker 영역에 해당됨

왜 사용하는가?

  • 메시지를 많은 사용자에게 전달해야할 때
  • 요청에 대한 처리시간이 길어 해당 요청을 다른 API에 위임하고 빠른 응답처리가 필요할 때
  • 애플리케이션 간 결합도를 낮춰야 할 때

Producer

  • 메시지를 생성하고 발송하는 주체
  • 메시지를 Queue에 직접 전달하지 않고 항상 Exchange를 통해 전달함

Consumer

  • 메시지를 수신하는 주체
  • Queue에 직접 접근하여 메시지를 가져옴

Queue

  • Producer들이 발송한 메세지들이 Consumer가 소비하기 전까지 보관되는 장소
  • 같은 이름, 같은 설정으로 Queue 생성시 에러 없이 기존 Queue에 연결됨
  • 같은 이름, 다른 설정으로 Queue 생성시 에러 발생
  • Queue는 반드시 미리 정의해야 사용할 수 있음

Exchange

  • Producer들에게서 전달 받은 메시지들을 어떤 Queue들에 발송할지를 결정하는 주체
  • 일종의 라우터 개념
  • Exchange는 네 가지 타입으로 바인딩 가능함 (Direct, Topic, Headers, Fanout)

Binding

  • Exchange에게 메시지를 라우팅할 규칙을 지정하는 행위
  • 특정 조건에 맞는 메시지를 특정 큐에 전송하도록 설정함

Direct Exchange

  • 라우팅 키를 활용해 라우팅하는 타입
  • 디폴트로 사용되는 타입
  • 하나의 큐에 여러 개의 라우팅 키를 지정 가능
  • 여러 큐에 동일 라우팅 키를 지정 가능 (Fanout과 동일하게 작동)

Topic Exchange

  • 라우팅 키 패턴을 활용해 라우팅하는 타입
  • Q1
    • .orange.
  • Q2
    • **..rabbit
    • lazy.*
  • 라우팅 키가 example.orange.rabbit일 경우 메시지가 Q1, Q2 모두 전달
  • 라우팅 키가 example.orange.turtle 인 경우 메세지가 Q1에만 전달
  • 라우팅 키가 lazy.grape.rabbit인 경우엔 메세지가 Q2에 한 번만 전달. (라우팅 패턴이 여러 개 일치하더라도 하나의 큐에는 메세지가 한 번만 전달됨)

Header Exchange

  • Topic Exchange와 유사함
  • 라우팅을 위해 key:value 형태의 헤더를 사용함

Fanout Exchange

  • 등록된 모든 Queue에 메시지 전달

Message 및 Queue 보존

  • RabbitMQ가 종료되면 기본적으로 Queue는 모두 제거됨
  • Message와 Queue 데이터를 보존하기 위해서 Queue 생성시 Durable 옵션에 true 주고 생성해야함
  • Producer가 메시지 발송시 PERSISTENT_TEXT_PLAIN 옵션을 주어야함

Prefetch Count

  • 하나의 Queue에 여러 Consumer가 존재할 경우, Queue는 기본적으로 Round-Robin 방식으로 메세지를 분배함.
  • Consumer가 2개인 상황에서 홀수번째 메세지는 처리 시간이 짧고, 짝수번째 메세지는 처리 시간이 매우 긴 경우, 계속해서 하나의 Consumer만 일을 하게 되는 상황이 발생할 수 있음
  • 이를 예방하기 위해, prefetch count를 1로 설정해 두면, 하나의 메세지가 처리되기 전(Ack를 보내기 전)에는 새로운 메세지를 받지 않게 되므로, 작업을 분산시킬 수 있음

Channels

  • Consumer 어플리케이션에서 Broker 로 많은 연결을 맺는 것은 바람직하지 않다.
  • RabbitMQ는 Channel 이라는 개념을 통해 하나의 TCP 연결을 공유해서 사용할 수 있는 기능을 제공한다.
  • 하지만 멀티 스레드, 멀티 프로세스를 사용하는 작업에서는 각각 별도의 Channel 을 열고 사용하는 것이 바람직하다.

Virtual Hosts

  • 하나의 Broker 에서 운영 환경(ex. live, dev)에 따라 Users, Exchange, Queue 등을 각각 사용할 수 있는 Vhosts 컨셉을 갖고 있다.

참고

반응형

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

[RabbitMQ] Spring 연동  (0) 2020.12.30
[RabbitMQ] Web UI  (0) 2020.12.30
[RabbitMQ] 클러스터 구성하기  (0) 2020.12.30
[RabbitMQ] 설치하기  (0) 2020.12.30

+ Recent posts