BE & Infra

RabbitMQ

hyukji 2024. 8. 23. 01:28

RabbitMQ란?

AMQP(Advanced Message Queuing Protocol)를 구현하여 메세지 생성자와 소비자 사이에서 메세지를 중계해주는 메세지 브로커 이다.

  • AMQP는 메세지 지향 미들웨어를 위한 개방형 표준 응용 계층 프로토콜
  • 메세지 지향 미들웨어는 비동기 메세지를 사용하는 응용프로그램들 사이에서 데이터를 송수신 하는 것을 의미. 이러한 시스템을 구현한 솔루션을 메세지 큐 라고 한다.

메세지 큐를 사용하는 이유

 

  • 비동기
    • 메세지 큐의 경우 생산된 메세지의 저장, 전송에 대해 동기화 처리 하지 않고 Queue에 넣어두기 때문에 나중에 처리가 가능하다. 이로 인해 병목현상을 방지할 수 있음
  • 낮은 결합도
    • Producer와 Consumer가 독립적으로 행동하면서 서비스 간의 결합도가 낮아진다.
  •  확장성
    • 다수의 프로세스들이 메세지 큐를 통해 메세지를 보낼 수 있어 확장성 및 분산처리에 대한 장점을 가짐
  •  탄력성
    • 메세지를 받아서 처리하는 서비스가 중지되어도 메세지큐가 중지된 것이 아니여서, 서비스가 재시작되면 Queue에 있는 메세지 다시 처리할 수 있음
  •  보장성
    • 메세지 큐는 보관되는 모든 메세지가 결국 Consumer 서비스에게 전달된다는 일반적인 보장을 제공

 

추가적으로 메세지 브로커의 경우 메세지를 받아서 처리하고 나면 즉시 또는 짧은 시간 내에 메세지가 삭제되는 구조이며 RabbitMQ, Redis 가 메세지 브로커에 해당된다.

반면에 이벤트 브로커의 경우 발생한 이벤트를 보존한다는 특징을 가지며 Kafka는 이벤트 브로커에 해당한다.

 

 

RabbitMQ 구조

  • Producer
    • 메세지를 생성하고 발송하는 주체.
    • Producer는 메세지를 Queue에 직접 보내는 것이 아니라 Exchange에 Publish한다.
  • Consumer
    • 메세지를 받아서 처리하는 주체
  • Exchage
    • Producer로 부터 받은 메세지를 어떤 Queue에 발송할지 결정하는 객체.
    • 4가지 타입 존재 : Direct, Topic, Headers, Fanout
    • 각각의 타입과 Binding 규칙에 따라 적절한 Queue로 메세지를 전달
  • Binding
    • Exchange와 Queue를 연결하는 관계
    • Exchange Type과 Binding 규칙에 따라 적절한 Queue로 메세지가 전달된다.
  • Queue
    • RabbitMQ안에서 메세지를 일시적으로 저장하는 장소.
    • Consumer들은 Queue에 저장된 메세지를 읽어들인다.
    • Queue는 RabbitMQ서버가 설치되는 호스트의 디스크 용량 및 메모리에 한정된다.

 

 

Exchange Type

  • Direct Exchange
    • 메세지를 포함한 routing key를 기반으로 queue에 메세지 전달
    • 하나의 queue에 여러가지 key, 여러 queue에 같은 key를 지저할 수도 있음

 

  • Topic Exchange
    • 메세지에 포함된 routing key의 패턴을 이용하여 라우팅하는 기법.
    • 여러 consumer에서 메세지 형태에 따라 선택적으로 수신해야 하는 경우와 같이 다양한 publish/subscribe 패턴 구현에 활용된다.
    • 위의 경우에서 quick.black.cat 은 q1, q2 모두 전달된다.

  • Headers Exchange
    • 메세지 라우팅을 위해 header를 사용하는 방식. binding key만을 사용하는 것보다 다양한 속성을 사용할 수 있다.
    • routing key 속성은 무시되고 headers 속성의 값이 바인딩 시 지정된 값과 같은 경우에 일치하는 것으로 간주된다.
  • Fanout Exchange
    • routing key에 관계 없이 Exchange에 등록된 모든 Queue에 동일한 메세지를 전달하는 BroadCast 방식으로 동작

 

 

Round-Robin Dispatch, Fair Dispatch

 

  • 만일 하나의 Queue에 여러 개의 Consumer가 붙어있다면 RabbitMQ에서는 RR 방식을 통해 Consumer에게 메세지를 균등하게 분배한다. → 하지만 특정 Consumer에게만 무거운 메세지만 계속 갈 수도 있다.
  • Prefetch로 해결 : Queue의 메세지를 Consumer의 메모리에 쌓아둘 수 있는 최대 메세지의 양으로 Prefetch count 값을 설정하면 하나의 메세지가 처리되기 전에는 새로운 메세지를 받지 않는다.
    • default값 : 250으로 메세지를 250개 이상 못가져 간다.

 

 

 

 

 

 

ref 

https://wildeveloperetrain.tistory.com/317

  •