본문 바로가기
  • A space that records me :)
기술/RabbitMQ

[RabbitMQ] RabbitMQ 기본 개념

by yjkim_97 2020. 11. 19.

내가 프론트엔드 개발로 참여한 프로젝트가 있다. 지금은 종료되었지만, 각 서버끼리 메시지를 주고받아 캐시 데이터 등을 공유하기 위해 RabbitMQ가 사용되었다.

내가 직접 RabbitMQ를 세팅한 것은 아니지만, 웹에서 캐시가 변경되면 RabbitMQ에 물려있는 서버들에게 노티를 해주었다.

프로젝트 마감 후 조금의 여유가 생겨, RabbitMQ가 정확히 무엇인지 궁금해 알아보았다.

 


2020 KT CPN 시스템

  • FM 서버 간에 노티 처리를 위해 사용
  • 대표적으로 한 서버에서 캐시가 변동되면, 다른 서버에도 동일한 작업을 하도록 하기 위함이다.

 


RabbitMQ 개념

출처 : https://blog.dudaji.com/general/2020/05/25/rabbitmq.html

RabbitMQ란? AMQP 프로토콜을 구현한 메시지 중개인이다. Producer에게 메시지를 받아 Consumer에게 전달해주는 서비스로 시스템 간 메시지를 전달해주는 오픈소스 메시지 중개인 소프트웨어이다.

AMQP란?
Advanced Message Queueing protocol의 줄임말로 MQ으 오픈소스에 기반한 표준 프로토콜을 의미한다. AMQP 프로토콜을 사용한 가장 유명한 소프트웨어는 RabiitMQ이다. AMQP 프로토콜의 구성요소에는 Exchange, Queue, Binding이 있다.

RabbitMQ에는 Producer, Consumer, Queue, Exchange, Binding 개념이 있다.

 

  1. Producer는 메시지를 생성하고 발송하는 주체이다.
  2. Producer가 생성한 메시지는 Queue에 저장되는데, 직접 접근하지 않고 항상 Exchange를 통해 접근하여 저장한다.
  3. Exchange는 Binding을 통하여 Queue에 메시지를 저장한다. Binding은 Exchange에게 메시지를 라우팅 할 규칙을 지정하는 행위로, Exchange가 특정 조건에 맞는 메시지를 특정 Queue에 전송하도록 설정할 수 있다.
  4. Queue는 Producer가 발송한 메시지가 Consumer에서 응답 완료를 받기 전까지 보관되는 장소이다. Queue는 이름으로 구분되고, 고유한 이름이 여야 한다.
  5. 마지막으로 Consumer는 메시지를 수신하는 주체이다. Consumer는 Producer와 다르게 Queue에 직접 접근하여 메시지를 가져온다. 

Exchange Type

Exchange에는 Direct, Topic, Headders, Fanout 총 네 가지 타입이 있다.

 

Direct Exchange

  • Routhing key가 정확히 일치하는 Queue에 메시지를 전송한다.
  • 하나의 큐에 여러 개의 라우팅 키를 지정할 수 있다.
  • 전송 방식은 Unicast이다.

Topic Exchange

  • Routhing key 패턴이 일치하는 큐에 메시지를 전송한다.
  • 패턴 표시에는 *(한 단어), #(여러 단어) 등이 있다.
  • 만일 하나의 큐가 여러 개의 라우팅 패턴이 일치하더라도, 메시지는 한 번만 전달된다.
  • 전송 방식은 Multicast이다.

Headers Exchange

  • [key:value]로 이루어진 header값을 기준으로 일치하는 Queue에 메시지를 전송한다.
  • Topic타입과 유사하지만, 라우팅을 위해 헤더를 사용한다는 차이점이 있다.
  • 헤더가 존재하면 Topic은 무시된다.
  • 전송 방식은 Multicast이다.

Fanout Exchange

  • 해당 Exchange에 등록된 모든 Queue에 메시지를 전송한다.
  • 전송 방식은 Brodcast이다.

RabbitMQ RPC 기능 - Dispatching

RabbitMQ는 Request-Response로 Client와 Server를 이어 주기 위해 RPC 개념으로 기능을 제공한다.

 

RPC란? Remote Procedure Call (원격 프러시저 호출)로 클라이언트의 요청을 서버에게 전달하고, 서버가 처리한 결과를 클라이언트에게 응답하는 방법을 말한다.

처리 흐름
1. 클라이언트(Produser)가 RabbitMQ의 Request용 Queue에 데이터(메시지)를 Push(저장)한다.
2. 서버에서 Request용 Queue에 있는 데이터(메시지)를 처리한다.
3. 서버는 요청 처리 후 Response용 Queue에 Push 한다.
4. 클라이언트는 Responsse용 Queue를 Subscribe 하고 있다가 서버로부터 응답이 오면 응답에 따라 알맞은 처리를 한다.

 

만약 하나의 Queue를 여러 개의 Consumer가 바라보고 있다면, RabbitMQ는 Round-robin을 사용하여 메시지를 균등하게 분배한다.

 

분배를 실패한 경우도 존재한다. 예를 들면 Consumer 서버가 죽었을 경우 또는 RabbitMQ 서버가 죽은 경우 등이 있다.

 

만일 소비자 서버가 죽어 분배를 실패한 경우(Queue가 소비자의 ACK신호를 받지 못함), RabbitMQ는 대기를 하고 있다가 메시지를 전달한 소비자의 서버 상태를 확인한 후, Disconnected와 같은 신호를 받으면 해당 소비자를 제외하고 다른 소비자에게 동일한 메시지를 전달한다.

 

두 번째로 메시지를 소비자에게 전달하기 전에 RabbitMQ의 서버가 죽는다면 모단 데이터가 소멸한다는 문제점이 있다. 이것을 해결하기 위해, 메시지가 Queue에 저장될 때, Disk의 파일에도 동시에 저장한다. 


https://blog.dudaji.com/general/2020/05/25/rabbitmq.html

 

RabbitMQ란?

서비스를 개발하면서 API-Gateway에 토큰 캐시를 구축하기 위해 RabbitMQ를 공부했던 내용을 정리해 보았습니다.

blog.dudaji.com

 

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

[Spring Boot] RabbitMQ 사용  (0) 2021.01.06