개발.log/rabbitMQ

[RabbitMQ] 처음 만나는 rabbitMq + springboot + stomp : Message broker 이해

개발하는 주디씨 2023. 4. 18. 09:49

RabbitMQ란?

메시지 지향 미들웨어(MOM)로서, 분산 시스템에서 애플리케이션 컴포넌트 간에 메시지를 안정적이고 확실하게 전송하기 위해 설계된 오픈소스 소프트웨어이다. RabbitMQ는 다양한 프로토콜을 지원하며, 주로 AMQP(Advanced Message Queuing Protocol) 프로토콜을 사용한다. AMQP는 메시지 지향 미들웨어 시스템에서 안정적인 메시지 전송을 위한 표준 프로토콜로, RabbitMQ는 이 프로토콜을 기반으로 메시지를 주고 받는다.

RabbitMQ는 큐(Queue)와 교환기(Exchange)를 중심으로 동작하는데 메시지를 생성하고 큐에 보내는 것을 '메시지 발행(Publish)'이라고 하며, 큐로부터 메시지를 받아 처리하는 것을 '메시지 구독(Subscribe)'이라고 한다. RabbitMQ는 이러한 발행-구독 모델을 통해 메시지를 안정적으로 전송하게 된다고 할 수 있다.

RabbitMQ는 이러한 메시지 전송 시스템을 통해, 분산 시스템에서의 데이터 처리, 비동기 처리, 애플리케이션 간 연동 등을 위한 기능을 제공한다. 

 


 

RabbitMq를 사용하는 경우 / 필요한 경우

근본적으로 애플리케이션 간에 결합도를 낮추기 위하여 사용한다.

🔔 요청을 많은 사용자에게 전달할 때
🔔 요청에 대한 처리시간이 길 때
🔔 많은 작업이 요청되어 처리를 해야할 때
🔔 해당하는 요청을 다른 API에게 위임하고 빠른 응답을 할 때

 


Message Broker

rabbitMq에 대한 설명을 할 때
message broker 라는 말을 빼고 말할 수 없다.

Message Broker가 도대체 뭘까?

 

메시지 브로커는 분산 시스템에서 서로 다른 애플리케이션 간의 통신을 중개하는 미들웨어이다. 메시지 브로커는 발신자가 보낸 메시지를 수신자가 구독할 수 있도록 중개하는 역할을 한다. 발신자는 메시지 브로커에게 메시지를 전송하고, 수신자는 메시지 브로커에게 메시지를 구독하면 된다. 이렇게 메시지 브로커를 사용하면 애플리케이션 간의 통신을 느슨하게 결합시키고, 메시지의 전송과 처리를 안정적으로 보장할 수 있다. 메시지 브로커는 RabbitMQ, Apache Kafka, ActiveMQ 등 다양한 소프트웨어로 구현될 수 있다.

 

 


RabbitMq 특징

 

메시지 지향(Message-oriented)

RabbitMQ는 메시지를 기반으로 데이터를 처리한다.

 

동기 및 비동기 메시지 처리 지원

RabbitMQ는 큐와 교환기를 이용해 메시지를 처리한다.

 

프로듀서와 컨슈머를 위한 API 제공

RabbitMQ는 Java, .NET, Python, Ruby, PHP 등 다양한 언어에서 사용 가능한 API를 제공한다.

 

멀티프로토콜 지원

RabbitMQ는 AMQP, STOMP, MQTT 등 다양한 프로토콜을 지원한다.

 

클러스터링 지원

RabbitMQ는 여러 개의 노드를 클러스터링하여 확장성과 가용성을 제공한다.

 

 


RabbitMq 중요개념

아래 내용은 rabbitMq manager UI 로, 추후 포스팅 될 내용이므로 지금은 rabbitMq에 대한 개념을 이해하기 위한 용도로만 이해하고자 한다.

 

 

1) Producer
메시지를 생성하고 RabbitMQ에 보내는 애플리케이션 또는 시스템을 말한다.

 


 

 

2) Consumer
RabbitMQ에서 메시지를 소비하고 처리하는 애플리케이션 또는 시스템을 말한다.

 



3) Queue
메시지를 보관하는 버퍼로, Producer에서 보낸 메시지는 Queue에 저장되어 Consumer에서 처리된다. 

 

Queue 속성

  • Name
    큐의 이름을 나타내며, 큐를 식별하는데 사용된다.
  • Durable
    큐가 영구적으로 지속되어야 하는 경우 true로 설정된다. 이 경우, RabbitMQ가 중단되더라도 큐는 삭제되지 않는다.
  • Auto-Delete
    소비자가 모두 연결을 해제하면, 큐를 자동으로 삭제하려면 true로 설정한다.
  • Exclusive
    큐가 현재 연결에 대해서만 사용 가능한 경우 true로 설정한다. 다른 연결에서 큐를 사용하려고 하면, 에러가 발생한다.
  • Arguments
    클라이언트에서 추가적인 정보를 전달하는 데 사용되는 매개변수이다. 예를 들어, x-message-ttl 인수를 사용하여 메시지가 큐에 있을 수 있는 최대 시간을 지정할 수 있다.
  • Maximum priority
    큐에 저장할 수 있는 메시지의 최대 우선 순위 수를 나타낸다.
  • Maximum length
    큐가 포화 상태에 빠진 경우 큐에 저장할 수 있는 최대 메시지 수를 제한하는 속성이다.
  • Overflow behavior
    큐의 용량 한계에 도달하면 메시지를 어떻게 처리할 것인지에 대한 설정이다. 예를 들어, drop-head 또는 reject-publish 등의 옵션이 있다.

 

4) Exchange
Producer에서 생성한 메시지를 수신하고 해당 메시지를 Queue로 라우팅하는 룰을 정의하는 컴포넌트로 RabbitMQ에는 Direct, Fanout, Topic, Headers 등의 여러 Exchange 유형이 있다. rabbitMq 서버를 실행하면 기본적으로 생성되는 Exchange는 (AMQP default), amq.* 로 시작하는 exchange들이다. 

 

Exchange Type

  • Direct Exchange
    Routing Key와 Binding Key가 정확하게 일치하는 큐로 메시지를 하며, 하나의 메시지는 하나의 큐로 전달된다.
  • Fanout Exchange
    모든 바인딩된 큐로 메시지를 전달하고 하나의 메시지가 여러 큐로 전달된다.
  • Topic Exchange
    Binding Key와 Routing Key가 패턴 매칭되는 모든 큐로 메시지를 전달합니다.
    Binding Key는 '.'으로 구분된 단어들의 조합으로 이루어지며, Routing Key는 Binding Key와 동일한 형식으로 이루어집니다.
  • Headers Exchange
    헤더를 기반으로 큐로 메시지를 전달합니다.
    일치하는 헤더를 가진 큐로 메시지를 전달합니다.

 

Exchange 속성

  • Name
    Exchange의 이름이며, 유일해야 한다.
  • Type
    Exchange의 종류로서 Direct, Fanout, Topic, Headers 중 하나여야 합니다.
  • Durability
    Exchange의 지속성 여부를 결정하며, true로 설정하면 RabbitMQ가 재시작하더라도 Exchange가 유지된다.
  • Auto-delete
    Exchange의 자동 삭제 여부를 결정한다. true로 설정하면 Exchange에 바인딩된 큐가 없을 때 Exchange가 삭제된다.
  • Arguments
    Exchange의 추가적인 인수이고, 대부분의 경우 사용하지 않습니다.

 

 


5) Binding
Exchange와 Queue 간에 연결을 맺어주는 구성 요소이다. Binding에는 Exchange 유형, 라우팅 키 및 Queue가 포함된다. Exchange는 메시지가 발행되는 장소이고, Queue는 메시지를 받아들이는 장소입니다. 즉, Binding은 Exchange에서 발행된 메시지가 어떤 Queue에 전달되어야 하는지를 결정한다. 다음은 Binding에 포함되는 정보이다.

  • Exchange name: Binding이 적용되는 Exchange의 이름
  • Exchange Type : Exchange의 타입
  • Routing key: 메시지가 전달될 Queue를 결정하는 데 사용되는 값
  • Queue name: Binding이 적용되는 Queue의 이름

 


 


6) Virtual Host
RabbitMQ에는 여러 개의 Virtual Host를 생성할 수 있다. Virtual Host는 Queue, Exchange, Binding 및 사용자를 격리시키는 논리적인 개념이다.


 

7) Connection
Producer 또는 Consumer가 RabbitMQ와 통신하는 TCP 연결이다.


 

8) Channel
TCP 연결 내에서 만들어지는 가상 연결로, 메시지를 전송하고 받을 수 있다. 하나의 Connection 내에 여러 개의 Channel을 생성할 수 있고, 이를 통해 메시지를 병렬로 처리할 수 있으며, 연결 오버헤드를 최소화한다.

 

 

 

지금까지 rabbitMq가 어떤 것인지에 대한 기본적인 것을 알아보았다. 이제부턴 원하는 목표에 맞추어 rabbitMq를 어떻게 구현해야하는 지 포스팅해보려고 한다.