메세지 브로커: 래빗엠큐(RabbiMQ)

KDG: First things first!·2024년 11월 8일
0

Broker

목록 보기
3/3



래빗엠큐(RabbitMQ)란?

래빗엠큐(RabbitMq): 래빗엠큐는 고성능의 메시지 브로커로, 시스템 간의 비동기 통신을 가능하게 해 주는 메시지 큐 시스템아다. 오픈소스로 제공되며, 특히 AMQP(Advanced Message Queuing Protocol)를 기반으로 메시지를 처리한다. 다양한 프로토콜을 지원하고 확장성이 뛰어나며, 특히 신뢰성 있는 메시지 전달과 복잡한 메시지 라우팅에 적합하다는 특징을 가지고 있다.



래빗엠큐 특징

  • 메시지 큐 시스템
    래빗엠큐는 메시지를 큐에 저장하고, 이를 수신할 준비가 된 컨슈머에게 전달한다. 프로듀서(발신자)가 보낸 메시지를 래빗엠큐가 관리하는 큐에 담아두었다가 컨슈머(수신자)에게 전달하며, 비동기적이기 때문에 프로듀서와 컨슈머가 동시에 작업할 필요 없이 독립적으로 메시지를 송수신할 수 있다.


  • AMQP 지원
    AMQP는 메시지 브로커와 클라이언트 간의 메시지 송수신 규칙을 정의한 프로토콜로, 신뢰성과 보안성을 강화한다. RabbitMQ는 이 프로토콜을 기본으로 지원하며, MQTT, STOMP, HTTP 등도 사용할 수 있어 다양한 시스템과 쉽게 연동할 수 있다.


  • Exchange와 Queue

    • Exchange: 프로듀서가 보낸 메시지를 큐에 정확하게 배분하는 역할을 한다. Exchange는 메시지를 큐에 라우팅하기 위한 규칙을 가진다.
    • Queue: 실제 메시지가 저장되는 장소이다. Exchange가 메시지를 어떤 큐로 보낼지 결정하며, 이 큐에 쌓인 메시지를 컨슈머가 가져가 처리한다.

라우팅(Routing)은 메시지를 목적지에 맞게 분배하거나 경로를 지정하는 과정이다. 메시지를 여러 서비스나 큐로 전송할 때, 메시지를 각 목적지에 맞게 필터링하거나 전송 규칙을 설정하여 효율적으로 분배하는 것이 라우팅이다.


  • Exchange 유형
    RabbitMQ의 Exchange는 몇 가지 유형이 있으며, 각 유형은 메시지의 라우팅 방식을 정의한다:

    • Direct: 특정 라우팅 키와 일치하는 메시지를 지정된 큐로 전달한다.
    • Fanout: 라우팅 키와 상관없이 모든 연결된 큐에 메시지를 전송한다.
    • Topic: 라우팅 키의 패턴과 일치하는 큐에 메시지를 전달한다. (예: "user.signup" 또는 "order.payment")
    • Headers: 라우팅 키 대신 헤더 값을 기반으로 큐에 전달한다.
  • Binding(바인딩):
    Binding은 Exchange와 Queue 사이의 연결을 나타내며, 특정 Exchange와 특정 큐 간의 바인딩을 설정함으로써 메시지의 라우팅 규칙을 결정한다.
    Exchange와 Queue 간에 바인딩이 이루어지면, Exchange는 해당 바인딩에 따라 메시지를 큐로 전달한다.


  • 메시지 확인 및 안정성
    RabbitMQ는 메시지 전달 과정에서 메시지 유실을 방지하기 위한 다양한 안전 장치를 제공한다.

    • Ack/Nack (Acknowledgment): 컨슈머가 메시지를 수신하고 처리했음을 래빗엠큐에 확인해 줌으로써 메시지가 정확히 한 번 처리되었음을 보장한다. 만약 컨슈머가 메시지를 처리하지 못하면 Nack을 보내 재전송을 요청할 수 있다.

    • Persistent 메시지: 메시지를 디스크에 저장하여 래빗엠큐 서버가 재시작되더라도 메시지를 유지한다.


  • 확장성과 고가용성
    RabbitMQ는 여러 노드로 구성된 클러스터를 지원하며, 이를 통해 확장성과 가용성을 높일 수 있다. 특히 고가용성 기능을 위해 미러링된 큐를 제공하여 큐의 복제본을 다른 노드에 생성하여 장애 발생 시 다른 노드에서 작업을 이어갈 수 있다.

  • 플러그인 및 관리 도구
    RabbitMQ는 다양한 플러그인(예: HTTP API, MQTT 지원 등)을 제공하며, RabbitMQ Management Plugin을 통해 웹 기반 UI에서 큐의 상태를 모니터링하고, 메시지를 관리할 수 있다.



래빗엠큐 장단점

장점

  • 풍부한 메시징 패턴 지원
    여러 유형의 Exchange (Direct, Topic, Fanout, Headers)를 지원하여 다양한 라우팅 규칙과 패턴을 사용할 수 있어 메시지를 특정 큐로 정확하게 전달하거나, 여러 큐에 동시에 메시지를 전송하는 등의 유연한 메시징이 가능하다.

  • 높은 신뢰성과 내구성
    메시지의 영구 저장과 전송 실패 시 재전송을 지원해 신뢰할 수 있는 메시지 전송이 가능하다.
    데이터 유실 방지를 위해 메시지를 디스크에 저장하거나, 클러스터링을 통한 고가용성 설정이 가능하다.

  • 다양한 프로토콜 지원
    AMQP, MQTT, STOMP 등 여러 프로토콜을 지원해 다양한 시스템 및 환경에서 활용할 수 있다.

  • 클러스터링과 고가용성
    여러 노드를 클러스터링하여 하나의 메시지 큐 시스템을 확장할 수 있어, 분산 환경에서도 안정적인 운영이 가능하여 장애 발생 시 복제 및 백업을 통해 메시지의 안전성을 보장한다.

  • 손쉬운 관리
    RabbitMQ는 웹 기반의 관리 콘솔을 제공해 실시간으로 큐와 메시지 상태를 확인하고 관리할 수 있다.


단점

  • 확장성의 한계
    RabbitMQ는 복잡한 메시지 분배를 처리하는 데 최적화되어 있지만, 카프카와 같은 높은 스루풋을 요구하는 대용량 스트리밍 처리에는 적합하지 않다.

  • 설정과 운영의 복잡성
    고가용성 및 클러스터링 설정 시 고려해야 할 사항이 많아 운영과 관리가 복잡할 수 있습니다.

  • 메시지 처리량
    빠른 순차적 메시지 처리보다 안정성과 신뢰성에 초점이 맞춰져 있어, 고속 스트리밍보다는 트랜잭션 중심의 시스템에 적합합니다.



래빗엠큐 사용 예시

  • 이메일 또는 알림 시스템: 사용자 가입 시 이메일 발송, 주문 발생 시 알림 전송 등 비동기로 처리해도 되는 작업을 메시지 큐를 통해 처리함으로써 메인 프로세스의 부담을 줄인다.

  • 비동기 데이터 처리 필요시: 이미지 처리나 데이터 분석 등 시간이 오래 걸리는 작업을 메시지 큐에 전달하여, 작업이 완료되면 결과를 전달기 때문에 유저를 마냥 기다리게 할 필요 없어 유저의 사용 편의성이 증대된다.

  • 마이크로서비스(MSA) 간 통신: 서로 독립적으로 동작하는 마이크로서비스들이 비동기로 데이터를 교환할 때 RabbitMQ를 사용하면 메시지 손실 없이 신뢰성 있는 통신을 보장할 수 있다.

  • 주문 처리 시스템: 결제 완료 후 주문 처리 작업을 RabbitMQ 큐에 저장하고, 다양한 백엔드 시스템에서 이를 비동기로 받아 처리함으로써 실시간성을 유지할 수 있다.

profile
알고리즘, 자료구조 블로그: https://gyun97.github.io/

0개의 댓글