프론트엔드 개발자 중규리 입니다 ദി ᷇ᵕ ᷆ ) 자세히보기

기술/학습

RabbitMQ(1) - RabbitMQ 기초, Kafka와 차이점

중규리 2024. 4. 14. 22:05

 

이번에 회사에서 3일간 RabbitMQ 교육을 다녀오게 되었다.

내일부터 시작되는 교육 전, 사전에 학습한 내용을 정리해보았다.

 

기본

메시지 큐

 

RabbitMQ, Redis, Kafka.. 모두 메시지 큐 기반의 시스템이다.

메시지 큐란, 프로세스 또는 프로그램 인스턴스가 데이터를 교환할 때 사용하는 통신 방법이다.

크게 정보를 제공하는 Producer, 정보가 잠시 담겨있는 Queue, 정보를 제공받는 Consumer 가 있다.

 

메시지 큐의 장점은 아래와 같다.

  • 비동기(Asynchronous)
    • Queue가 있기 때문에 비동기 처리하며 병목현상 방지 가능
  • 낮은 결합도(Decoupling)
    • 정보를 제공하는 서비스와 받는 서비스가 분리되며 결합도가 낮아진다.
  • 확장성(Scalable)
    • 다수의 프로세스가 메시지 큐를 통해 메시지를 전달할 수 있기 때문에 확장성이 뛰어나다.
  • 탄력성(Resilience)
    • 메시지가 Queue에 담기기 때문에, 서비스가 중지되어도 Queue가 중지된 것은 아니기 때문에 Queue에 있는 메시지를 후에 다시 처리할 수 있다.
  • 보장성(Guarantees)
    • Queue에 보관된 메시지가 Consumer에게 전달된다는 보장을 제공한다.

 

메시지 브로커

기본적으로 RabbitMQ는 AMQP(Advanced Message Queuing Protocol) 기반의 메시지 브로커이다.

사용자가 많거나, 요청 처리 시간일 길 때, 해당 요청을 다른 API에게 넘기고 빠른 응답을 할 때 사용한다.

AMQP란, 메시지 지향 미들웨어를 위한 개방형 표준 응용 계층 프로토콜을 뜻한다. 쉽게 말해서, 메시지 큐(MQ) 오픈소스의 표준 프로토콜이라고 할 수 있다.


조금 빠른 것 같지만, RabbitMQ와 Kafka의 결정적인 차이점이 바로 RabbitMQ가 메시지 브로커라는 점이다.

RabbitMQ, Redis는 메시지 브로커이며, Kafka는 이벤트 브로커이다.

 

기본적으로 메시지 브로커는 이벤트 브로커의 역할을 할 수 없지만, 반대로 이벤트 브로커는 메시지 브로커의 역할을 할 수 있다.

 

메시지 브로커의 경우, 많은 기업의 대규모 메시지 기반 미들웨어 아키텍쳐에서 사용되어왔다. 기본적으로 큐에 메시지를 보내고 받으며프로듀서와 컨슈머 간 네트워크를 구성하기 위해 사용되었다.

메시지 브로커의 특징은 메시지를 처리하면 즉시 또는 짧은 시간 안에 메시지가 삭제되는 구조라는 점이 있다.

 

이벤트 브로커의 경우, 이벤트(메시지, 레코드)를 하나만 보관하고 인덱스를 통해 개별 액세스를 관리한다.

또한 메시지 브로커와 다르게, 필요한 시간 동안 이벤트를 보존할 수 있다.

 

즉 메시지 브로커는 메시지를 보내고 처리하고 삭제하지만, 이벤트 브로커는 삭제하지 않는다는 점이 가장 큰 차이점이다.

 

본 포스팅은 Kafka가 아닌 RabbitMQ에 대한 내용이므로, 영상에서 언급되는 이벤트 브로커에 대한 자세한 내용은 생략했다.

 

개념

위 그림은 RabbitMQ의 전반적인 동작 방식을 나타낸 그림이다. 메시지 큐의 동작 방식 사이에 RabbitMQ만의 개념이 약간 추가되었다.

  • Producer
    • 메시지 큐에서 다룬 키워드이지만, RabbitMQ에서는 Producer가 메시지를 Queue가 아닌 Exchange로 전달한다는 특징이 있다.
  • Exchange
    • Producer로부터 전달 받은 정보를 어떤 Queue에 담을지 결정한다.
    • 총 4가지 타입이 있으며, Router와 같다고 생각하면 된다.
      • Direct, Topic, Headers, Fanout
  • Binding
    • Exchange에게 메시지를 라우팅할 규칙을 지정하는 행위이다.
    • 특정 조건에 맞는 메시지를 특정 큐에 전송하도록 하며, Exchange의 타입에 맞게 설정되어야한다.
    • Exchange와 Queue는 m:n 바인딩이 가능하다.
  • Queue
    • 메시지(정보)를 일시적으로 저장하는 장소이다.
    • Queue는 호스트의 디스크 용량 및 메모리에 한정된다.
  • Consumer
    • 메시지를 수신하는 주체이며, Consumer들은 Queue에서 저장된 메시지를 읽는다.

 

Exchange Types

Exchange에는 총 4가지 타입이 있다.

1️⃣ Direct

 

메시지에 포함된 Routing Key를 바탕으로 Queue에 메시지를 전달한다.

여러 Queue에 같은 Routing Key를 지정해서 Fanout처럼 동작하도록 할 수 있다.

Default Exchange는 이름이 없는 Direct Exchange이며, RabbitMQ에서 생성되는 Queue가 자동으로 바인딩 되는데, 이때 각 Queue의 이름이 Routing Key로 설정된다.

 

2️⃣ Topic

 

Routing Key 패턴이 일치하는 모든 Queue에 메시지를 라우팅한다. 여러 Consumer에서 메시지 형태에 따라 선택적으로 수신해야하는 경우와 같이, Publish/Subscribe 패턴에서 사용될 수 있다.

라우팅 패턴이 여러개 일치하더라도 하나의 큐에는 한개의 메시지만 전달된다.

 

Binding Keyy는 온점(.)으로 구분된 단어의 조합으로 정의되고, (*)과 (#)을 사용할 수 있다.

(*) : 정확히 하나의 단어만 대체

(#) : 0개 혹은 여러 개의 단어 대체

(*)과 (#) 같은 와일드카드는 Direct에서 지원되지 않는다.

 

3️⃣ Headers

 

Topic과 유사하지만, Header를 이용하기 때문에 더 다양한 속성을 이용할 수 있다.

Routing Key 속성은 무시되지만, headers 속성이 바인딩 시 지정된 값과 같은 경우일 때 같은 경우에 일치하는 것으로 간주된다.

 

3️⃣ Fanout

 

Routing key에 관계 없이, 모든 Queue에 동일한 메시지를 전달하는 브로드캐스트 라우팅 방식이다.

 

Dispatching

다수의 Consumer가 1개의 Queue와 연결되어있다면, 라운드 로빈 방식으로 메시지를 분배한다.

이러한 특성으로 중복 처리를 방지하면서, 프로그램을 수평적으로 확장할 수 있다.

 

Fair Dispatching & Prefetch Count

하지만 다수의 Consumer가 2개 이상의 Queue와 연결되어있다면, 라운드 로빈 방식으로 효율성을 보장할 수 없다.

가령 홀수 번째 메시지 처리 시간이 매우 짧고, 짝수 번째 메시지 처리 시간이 매우 길다면 짝수 번째 메시지를 처리하는 Consumer에는 지속적으로 지연이 발생한다.

때문에 RabbitMQ에는 Prefetch Count라는 개념이 있다.

이는 Queue에 메시지를 Consumer의 메모리에 쌓아둘 수 있는 최대 메시지의 양으로, Prefetch Conut의 값이 1로 설정된다면 하나의 메시지가 처리되기 전에는 새로운 메시지를 받지 않기 때문에 작업을 분산시킬 수 있다.

 

Message 보존

RabbitMQ 서버가 재기동되면 Queue는 모두 제거된다.

이를 방지하기 위해 Queue 생성 시, Durable 옵션에 true를 설정하고,

Producer가 메시지를 발송할 때 PERSISTENT_TEXT_PLAIN 옵션을 주어야 메시지가 보존된다.

// Queue 생성, QueueName 다음이 durable option
rabbitmqChannel.queueDeclare(rabbitmqQueueName, true, false, false, null);

// 메시지 발송
rabbitmqChannel.basicPublish(exchangeName, routingKey, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());

 

출처

https://www.cloudamqp.com/blog/what-is-message-queuing.html

https://somaz.tistory.com/119

https://wildeveloperetrain.tistory.com/317

https://velog.io/@cho876/%EC%B9%B4%ED%94%84%EC%B9%B4kafka-vs-RabbitMQ

https://www.cloudamqp.com/blog/part1-rabbitmq-for-beginners-what-is-rabbitmq.html

https://blog.devops.dev/rabbitmq-exchange-types-explained-5fd9086595f5

 

'기술 > 학습' 카테고리의 다른 글

RabbitMQ(2) - RabbitMQ, GemFire 개념 및 등장 배경  (0) 2024.04.17