[MQ] RabbitMQ란?

2025. 7. 28. 18:24·MQ

※ 이 글은 인프런  RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기 강의를 들으면서 학습한 내용을 정리한 글입니다. 일부 내용을 인용하였으며, 문제가 될 시 인용 부분을 수정 또는 삭제하겠습니다.

 

AMQP란?

Advanced Message Queuing Protocol의 약자로, MQ의 오픈소스에 기반한 표준 프로토콜을 의미한다.

 

AMQP 특징

  • 네트워크 상으로 전송되는 명령어들의 표준화
  • AMQP 명세를 따르는 모든 Broker들은 똑같은 방식으로 동작
    • 메시지 수신, 라우팅, 큐 관리, 메시지 전달 보장의 기능을 수행
  • 서로 다른 언어, 플랫폼 간에도 동일한 방식으로 메시지를 주고받을 수 있음
  • 다양한 언어별 클라이언트 라이브러리를 제공
    • Java, Python, Ruby, .NET 등

 

RabbitMQ란?

AMQP를 구현한 오픈소스 메세지 브로커이다.

시스템 간 비동기 메시징을 가능하게 하여 서비스 간 통신을 안정적이고 효율적으로 처리할 수 있게 해준다.

 

메세지큐를 사용하는 이유

  • 성능 향상: 병목 완화, 부하 분산
  • 역할 분리: 요청에 대한 응답을 기다릴 필요가 없기 때문에 각 영역은 자신 역할에만 집중 가능
  • 신뢰성: 데이터를 메모리 대신에 디스크에 저장하여 데이터 유실을 방지, 장애 복구 가능
  • 확장성: 기능별로 모듈 분리 및 독립적 확장 가능
  • 유연성: 다양한 exchange 유형과 라우팅 규칙을 지원
  • 프로토콜 및 언어 지원: AMQP, STOMP, MQTT 등 다양한 프로토콜 및 Java, Python 등 다양한 언어별 클라이언트 라이브러리 제공

 

Rabbit MQ의 구조

  1.  Producer (Publisher)
    • 메시지를 생성하고 RabbitMQ에 전송
    • 특정 Exchange에 메시지를 전송하고 Exchange는 메시지를 라우팅하여 큐에 배치
  2. Exchange
    • Publisher로부터 수신한 메시지를 적절한 큐에 전달
    • Exchange 유형 
      • Direct: Routing Key와 일치하는 모든 큐에 메시지를 전송
      • Fanout: Routing Key를 무시. 모든 큐에 메시지를 브로드캐스트
      • Topic: Direct 와 Fanout 의 중간으로, 라우팅 키 패턴이 일치하는 모든 큐에 메시지를 전송
      • Headers: Routing Key를 무시. 메시지 헤더의 key-value 속성 쌍에 따라 메시지를 라우팅
    • 메시지가 Exchange로 전송될 때, Routing Key가 함께 전달
      • Routing Key는 메시지를 어떤 Queue로 보낼지 결정하기 위한 주소 정보로, 메시지를 전송할 때 Publisher가 Exchange에 전달하는 키이다.
      • Exchange는 Routing Key를 보고 어떤 Queue에 메시지를 전달할지 결정한다.
  3. Queue
    • 메시지를 일시적으로 저장하는 버퍼 역할
    • Producer가 보낸 메시지를 Consumer가 수신할 때까지 보관한다.
    • RabbitMQ의 Queue는 FIFO (First In, First Out) 방식으로 동작한다.
    • 각 Queue는 여러 Consumer가 구독 (수신)할 수 있으며, 메시지는 비동기적으로 처리된다.
    • 하나의 메시지가 여러 Consumer에게 중복으로 전달될 수 없다. -> Fanout Exchange 방식을 사용
  4. Binding
    • Exchange와 Queue의 mapping을 담당
    • 메시지를 라우팅할 때 어떤 조건으로 Queue에 보낼지 정의 -> Binding Key를 사용
    • Binding Key와 Routing Key가 일치하면 해당 Queue로 메시지가 전달
  5. Consumer (Subscriber)
    • Queue에서 메시지를 가져와서 처리
    • 메시지를 정상적으로 처리한 후에 메시지에 대한 확인 응답 (ACK)를 메시지 브로커에 전송한다.
      • 메시지가 성공적으로 처리되었음을 RabbitMQ에 알리는 과정 
      • ACK를 보내지 않으면, 브로커는 메시지를 재전송하거나 다른 Consumer에게 전달한다.

 

Exchange 유형

  1. Direct Exchange
    • Routing Key에 따라 특정 Queue로 하나씩 전달하는 방식
    • 하나의 Routing Key에 여러 Queue가 Binding 될 수 있기 때문에 1:1 or 1:N
    • 메시지가 특정 Queue로 명확하게 전달되어야 할 때 또는 각 Queue에 고유한 라우팅 규칙을 적용하여 메시지를 분류해야 할 때 사용한다.
    • ex) 주문 상태 처리, 결제 처리, 사용자 알림 시스템 등
  2. Fanout Exchange
    • Routing Key에 관계없이 메시지를 모든 Binding된 Queue에 전달하는 브로드캐스트 방식
    • 모든 Queue에 동일한 메시지를 전달한다.
    • ex) 시스템 점검 공지
  3. Topic Exchange
    • Routing Key를 패턴 기반으로 정의하여 메시지를 여러 큐에 유연하게 전달할 수 있는 방식
      • *: 단어 1개 일치, log.* -> log.warn, log.error, log.info 메시지 수신 가능
      • #: 단어 0개 이상 일치, order.# -> order.created, order.shipped.express 메시지 수신 가능
  4. Headers Exchange
    • 메시지의 헤더에 있는 key-value 쌍을 기반으로 라우팅하는 방식
    • language: "ko" -> 한국어로 처리, language: "en" -> 영어로 처리
    • ex) 다국어 서비스, 등급별 혜택 알림

'MQ' 카테고리의 다른 글

[MQ] Dead Letter Queue와 RetryTemplate을 활용한 메시지 재처리  (3) 2025.08.01
[MQ] Routing Model을 이용한 Log 수집  (2) 2025.08.01
[MQ] WebSocket과 Pub/Sub을 통한 실시간 웹 알림 구현하기  (3) 2025.07.31
[MQ] 여러 Consumer에게 메시지 분산 처리하기  (2) 2025.07.30
[MQ] RabbitMQ의 기본 비동기 메시지 전송  (1) 2025.07.30
'MQ' 카테고리의 다른 글
  • [MQ] Routing Model을 이용한 Log 수집
  • [MQ] WebSocket과 Pub/Sub을 통한 실시간 웹 알림 구현하기
  • [MQ] 여러 Consumer에게 메시지 분산 처리하기
  • [MQ] RabbitMQ의 기본 비동기 메시지 전송
starmk
starmk
공부한 것을 정리합니다
  • starmk
    star의 블로그
    starmk
  • 전체
    오늘
    어제
    • 분류 전체보기 (84)
      • Spring (14)
      • Algorithm (34)
        • 백준 (29)
      • 자료구조 (6)
      • AWS (8)
        • ACC (6)
      • Jpa (0)
      • 운영체제 (4)
      • Database (1)
      • 네트워크 (4)
      • Web (2)
      • Java (2)
      • MQ (8)
      • MSA (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
starmk
[MQ] RabbitMQ란?
상단으로

티스토리툴바