RabbitMQ란?

정찬's avatar
Dec 04, 2024
RabbitMQ란?
 
 
프로젝트에서 RabbitMq를 사용하라는 요구사항이 있었다.
예전부터 기술스택을 보면서 들어봤고, 대충 어떤 일을 하는지 정도만 파악해었다.
RabbitMq를 공부하고 사용하기 전에 이 기술스택을 왜 사용하는지 파악하는게 가장 중요하다고 생각해 글로 정리하게 되었다.
 
목차

Msa 환경에서 Message Queue와 Https

 
MSA 환경에서 서비스 간 통신 방식으로 HTTP와 Message Queue를 비교해보자
 

Http방식을 사용한 MSA

notion image
 
위의 이미지에서, 서비스 간 Https 기반 통신의 동기적 특성으로 인해 긴밀한 결합이 발생한다. 이는 Https 기반 통신이 주로 Request-Response 모델을 따르기 때문이다. 한 서비스에서 요청하는 모든 요청은 응답 서비스로부터 즉각적인 응답을 기대한다.
 
위의 어플리케이션의 경우 주문 완료는 관련된 인벤토리, 배송, 알림 서비스에 따라 달라진다. 주문 처리 서비스는 관련 서비스들의 응답을 동기적으로 기다려야 한다. 전반적으로, 긴밀한 결합은 주문 처리 서비스가 다른 모든 서비스로부터 즉각적인 응답을 받지 않고는 계속할 수 없기 때문에 발생한다.
 
이런 긴밀한 결합은 결국 Https 기반 마이크로서비스에서 몇 가지 단점을 초래한다.
 
  • 오류를 격리할 수 없다
    • 긴밀한 결합이 존재하는 경우, 한 서비스의 오류나 실패는 다른 상호 연결된 서비스에 연쇄적인 효과를 미칠 수 있다. 예를 들어, 주문 처리 서비스는 연결된 서비스로부터 즉각적인 응답을 기대하기 때문에, 서비스 중 하나에 오류나 버그가 발생하면 전체 주문 처리 흐름이 중단된다. 이는 결국 전체 시스템 기능의 고장으로 이어진다.
  • 긴 응답 시간
    • 긴밀한 결합은 서비스가 다른 사람의 즉각적인 응답을 기다려야 하므로 지연이나 무응답이 발생하면 응답 시간이 길어진다. 우리의 경우 지불, 재고, 알림 또는 배송 서비스의 지연은 주문 처리에 직접적인 영향을 미친다. 결과적으로 최종 사용자는 더 느린 주문 처리 시간으로 인해 좌절감을 느낄 수 있다.
  • 변경 사항을 도입의 비융통성
    • 새 마이크로서비스에서 제공하는 기능을 사용하려면 주문 처리 마이크로서비스의 코드 수정 및 재배포가 필요하게 된다.
 

Message Queue를 사용한 MSA

 
notion image
 
 
  • 오류 격리:
    • 아키텍처에 메시지 큐잉을 도입하여 서비스를 분리하는 비동기 통신을 가능하게 했다. 서비스 간의 직접적인 종속성이 제거되었기 때문에 서비스에 오류가 발생하더라도 다른 서비스는 독립적으로 요청을 계속 처리한다.
  • 응답 시간 단축:
    • 메시지 큐잉을 사용하면 서비스는 즉각적인 응답을 기다리지 않고 비동기적으로 요청을 처리할 수 있다. 예를 들어, 주문이 처리되면 주문 처리 서비스는 요청을 메시지 큐에 넣고 다른 작업을 진행할 수 있다. 재고, 알림 및 배송 서비스는 자체 속도에 맞춰 큐의 메시지를 소비하여 전체 응답 시간을 줄이고 사용자 경험을 개선할 수 있다.
  • 변경 도입의 유연성:
    • 메시지 큐잉은 마이크로서비스 간의 느슨한 결합을 촉진하여 변경을 도입하거나 새로운 기능을 추가하는 데 유연성을 제공한다. 우리의 사용 사례에서 사기 탐지 서비스와 같은 새로운 서비스가 도입되면 우리가 해야 할 일은 메시지 큐에 바인딩하고 메시지를 소비하는 것으로 끝난다. 기존 서비스를 업데이트할 필요가 없다.
 

RabbitMQ란?

 
RabbitMQ는 가장 널리 사용되는 오픈소스 메시지 브로커(Message Broker) 중 하나이다. Erlang으로 작성되었으며, AMQP(Advanced Message Queuing Protocol)를 구현한 메시지 지향 미들웨어이다.

RabbitMQ의 주요 특징

  • 신뢰성: 메시지 전달 보장, 지속성, 메시지 확인 응답, 고가용성 및 장애 복구 기능을 제공한다.
  • 유연한 라우팅: 메시지가 큐로 이동하기 전에 Exchange를 통해 라우팅한다. 여러 유형의 Exchange(Direct, Topic, Fanout, Headers)를 지원한다.
  • 클러스터링: 여러 RabbitMQ 서버를 하나의 논리적 브로커로 그룹화할 수 있습니다.
  • 다중 프로토콜: AMQP, MQTT, STOMP, HTTP 등 다양한 메시징 프로토콜을 지원한다.
  • 관리 UI: 웹 기반 UI를 통해 큐, Exchange, 바인딩 등을 관리할 수 있다.

RabbitMQ의 핵심 개념

  • Producer: 메시지를 보내는 애플리케이션
  • Consumer: 메시지를 받는 애플리케이션
  • Queue: 메시지가 저장되는 버퍼
  • Exchange: Producer로부터 받은 메시지를 큐로 라우팅하는 역할
  • Binding: Exchange와 Queue 사이의 관계를 정의

Exchange 타입

  • Direct Exchange: 라우팅 키를 기반으로 메시지를 큐에 전달
  • Topic Exchange: 와일드카드 매칭을 사용하여 라우팅 키 패턴을 기반으로 메시지를 전달
  • Fanout Exchange: 바인딩된 모든 큐에 메시지를 브로드캐스트
  • Headers Exchange: 메시지 헤더의 속성을 기반으로 라우팅

사용 사례

  • 비동기 처리: 시간이 오래 걸리는 작업을 비동기적으로 처리할 때 사용
  • 서비스 간 통신: 마이크로서비스 아키텍처에서 서비스 간의 통신을 처리
  • 부하 분산: 작업을 여러 워커에 분산시켜 처리할 때 사용
  • 이벤트 기반 처리: 이벤트 중심 아키텍처를 구현할 때 사용
 
Share article

More articles

See more posts

lushlife99