RabbitMQ란?
2022. 2. 9. 10:44ㆍETC
RabbitMQ란?
AMQP(Advanced Message Queueing Protocol)를 구현한 메시지 브로커입니다.
AMQP란?
AMQP는 간단하게 메시지 큐 프로토콜이라고 생각하면 됩니다.
메시지 생산자와 메시지 브로커, 메시지 소비자 간에 데이터 통신에 대해 정의하고 있습니다.
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 |