RabbitMQ란?

2022. 2. 9. 10:44ETC

RabbitMQ란?

AMQP(Advanced Message Queueing Protocol)를 구현한 메시지 브로커입니다.

AMQP란?

AMQP는 간단하게 메시지 큐 프로토콜이라고 생각하면 됩니다.

메시지 생산자와 메시지 브로커, 메시지 소비자 간에 데이터 통신에 대해 정의하고 있습니다.

RabbitMQ 동작 과정

RabbitMQ 구조

RabbitMQ는 AMQP를 구현한 제품이기 때문에 AMQP를 구성하는 개념들을 먼저 살펴 봅시다.

  • Exchange - 메시지를 생산자에게 전달받아 어떤 큐에 해당 메시지를 전달할지 결정하는 라우팅 역할을 합니다. 이 때, Exchange Type이라는 라우팅 알고리즘을 사용합니다. AMQP에서는 4가지 타입이 있는데 이에 대해서는 밑에서 자세히 알아봅시다.
  • Binding - 라우팅 테이블과 같은 개념입니다. Exchage에서 어떤 큐에 메시지를 전달할지 결정했다면, Binding으로 인해 해당 큐가 어디에 있는지 알 수 있습니다.
  • Queue - 메시지가 소비자가 가져가기 전에 순차적으로 저장되는 곳입니다. 메시지는 메모리에 저장되거나 옵션에 따라 디스크에 저장할 수 도 있습니다. 소비자가 메시지를 정상 처리하고 Ack를 Queue에 보내게되면 해당 메시지가 삭제됩니다.

Exchange Type

Exchange에는 네 가지 타입이 있는데, 각 타입별 특징은 아래와 같습니다.

타입 설명 특징
Direct Routing key가 정확히 일치하는 Queue에 메세지 전송 Unicast
Topic Routing key 패턴이 일치하는 Queue에 메세지 전송 Multicast
Headers [key:value]로 이루어진 header 값을 기준으로 일치하는 Queue에 메세지 전송
x-match라는 argument로 헤더를 어떤식으로 해석하고 매칭시킬지 결정하는데,
x-match가 all이면 모든 조건을 충족시켜야 한다는 것이고(AND),
any이면 최소 1개의 조건만 충족시키면 된다는 의미입니다.(OR)
Multicast
Fanout 해당 Exchange에 등록된 모든 Queue에 메세지 전송 Broadcast

RabbitMQ 특징

Message durability

  • RabbitMQ 서버가 죽는 경우 메모리에 저장되어있던 메시지들은 모두 소멸됩니다.
  • 이를 방지하기 위해 RabbitMQ는 Message durability 라는 메모리저장될 때, 디스크에도 같이 저장하는 옵션을 제공합니다.
  • 설정 방법은 Queue를 생성할 때, Durable 옵션에 true를 주고 생성해야 하며, Producer가 메세지를 발송할 때, PERSISTENT_TEXT_PLAIN 옵션을 주면 디스크에 저장됩니다.
  • 하지만 디스크에 저장할 때 서버가 죽는 경우, 메시지 손실은 막을 수 없습니다.

Prefetch Count

  • 하나의 큐에 여러 소비자가 연결되어 있는 경우, RabbitMQ는 기본적으로 라운드 로빈으로 소비자에게 메시지를 전달합니다.
  • 하지만 홀수번째 메시지는 소비자에게 처리 시간이 짧게 걸리고, 짝수번째 메시지는 처리 시간이 긴 메시지들이 큐에 쌓이면, 하나의 소비자만 계속 일을하게 되는 현상이 나올 수 있습니다.
  • 그래서 RabbitMQ는 Prefetch Count라는 옵션을 1로 설정해서 소비자가 Ack를 보내기전에는 다른 메시지를 받지 않도록하여 작업을 분배할 수 있습니다.

수평적 확장

  • 하나의 큐에 여러 소비자가 연결되어 있는 경우, 큐에 있는 메시지는 앞서 말한것 처럼 라운드 로빈으로 메시지를 하나하나 다른 소비자에게 전달합니다.
  • 이로서 메시지의 중복처리를 막을 수 있습니다.
  • 이와 같은 형태에서 소비자를 수평적으로 확장하는 것이 가능합니다.
  • 물론 하나의 큐에 여러 생산자를 연결하여 확장하는 것도 가능합니다.

소비자가 죽었을 경우

  • 소비자가 메시지를 처리하다가 죽었다고 판단되는 경우, RabbitMQ는 해당 메시지를 다른 소비자에게 보내 처리하도록 합니다.

메시지 손실 최소화 방법

RabbitMQ는 메시지 손실을 최소화하기 위해 다양한 매커니즘을 제공합니다.

  • Clustering
  • Message durability
  • Queue Mirroring
  • Master and Slave

이에 대한 자세한 설명은 아래 블로그를 참조하세요

https://m.blog.naver.com/PostView.naver?blogId=tmondev&logNo=221051503100&navType=by 

 

RabbitMQ로 메시지 손실 최소화 하는 법(1)

우리는 메시지를 발생한 후 받아서 처리하는 메시징 시스템의 도입이 필요했다. 물론 저장소를 이용하여 직...

blog.naver.com

왜 NHN은 Kafka 대신 RabbitMQ를 선택했는가?

'ETC' 카테고리의 다른 글

메시지 플랫폼 장애 에러 처리 비교 - SQS, RabbitMQ, Kafka  (0) 2022.02.15
메시징 플랫폼 비교 - SQS, SNS, Kafka, RabbitMQ  (2) 2022.02.11
Kafka(카프카)란?  (0) 2022.02.07
AWS SNS란?  (0) 2022.02.07
AWS SQS란?  (0) 2022.02.07