Spring-Cloud

RabbitMQ - 1:기본

  • -

이번 포스트에서는 RabbitMQ에 대해서 살펴보자.

 

RabbitMQ

 

RabbitMQ란?

RabbitMQ란 AMQP(Advanced Message Queuing Protocol)을 구현한 오프소스 메시지 브로커(Message Broker)이다. RabbitMQ를 이용하면 Application 간에 비동기적으로 메시지를 주고받을 수 있다.

AMQP: 메시지 지향 미들웨어(Message Oriented Middleware: MOM)에서 메시지 브로커 간의 통신을 표준화하기 위해 설계된 프로토콜

 

Why RabbitMQ?

다음은 RabbitMQ의 주요 장점이다.

  • 비동기 처리: 시간이 오래 걸리는 작업을 백그라운드에서 처리
  • 서비스 분리: 마이크로서비스 간의 느슨한 결합 구현
  • 부하 분산: 여러 컨슈머가 메시지를 나눠서 처리
  • 안정성: 메시지 영속화로 시스템 장애 시에도 메시지 보존
  • 유연성: 다양한 메시징 패턴 지원

사실 장점들을 많이 이야기 해봤지만 이 분야의 최대 강자는 Kafka이다. Kafka 대비 RabbitMQ의 최대 장점은 러닝 커브가 완만하다라는 점이다.

주요 개념

다음은 RabbitMQ의 주요 구성 요소들이다.

출처: https://www.cloudamqp.com/img/blog/exchanges-topic-fanout-direct.png

  • Producer (생산자) 메시지를 생성하고 Exchange로 전송하는 주체
  • Exchange (교환기) 메시지를 받아서 적절한 Queue로 라우팅하며 4가지 타입이 있음
    • Direct: 라우팅 키가 정확히 일치하는 큐로 전송
    • Fanout: 바인딩된 모든 큐로 전송 (브로드캐스트)
    • Topic: 패턴 매칭으로 큐 선택
    • Headers: 헤더 속성으로 라우팅
  • Queue (큐) 메시지가 저장되는 버퍼로 Consumer가 메시지를 가져갈 때까지 보관
  • Binding (바인딩) Exchange와 Queue를 연결하는 규칙
  • Consumer (소비자) Queue에서 메시지를 받아서 처리하는 주체

 

RabbitMQ 설치 및 동작 확인

 

설치

RabbitMQ 사이트에 가보면 docker를 이용해서 RabbitMQ를 사용하는 방법을 잘 안내해주고 있다. Docker Desktop을 통해 다음 명령을 실행해서 RabbitMQ를 설치하자.

# latest RabbitMQ 4.x
docker run -it --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:4-management
원문에는 --rm 옵션이 있어서 도커를 종료하면 삭제하도록 되어있는데 여기서는 제외 시켰다.

5672는 RabbitMQ가 서비스 하는 포트이고 15672 포트는 RabbitMQ 관리자 페이지이다.

관리자 페이지의 기본 계정은 guest/guest이다.

RabbitMQ 관리자 페이지

 

exchange 생성

RabbitMQ를 사용하면서 처음 할 일은 교환기인 Exchange를 설정하는 일이다. 

로그인 후 [Exchanges] 하단의 [Add a new exchange]를 통해 exchange를 추가해줄 수 있다. 중간의 Type에서 [direct], [fanout], [headers], [topic] 옵션을 선택할 수 있다.

새로운 Exchange 추가

하지만 만드는건 별거 아니니 일단 기본으로 등록되어있는 Exchange들을 사용해보자.

기본으로 등록되어있는 Exchange 들

 

Queue 생성

다음은 Exchange에 전달된 메시지들을 저장해두는 Queue를 만들어주자.

[Queues and Streams] 하단의 [Add Queue] 메뉴를 이용한다. Queue의 이름 정도만 지정해주자.

Queue 추가하기

추가로 fanoutQueue, topicQueue도 동일한 방법으로 추가한다.

Queue 추가 결과

 

QueueBinding

 

Queue Binding

다음으로 등록된 Queue를 특정 Exchange에 바인딩 시켜주자. 지금은 direct 타입의 Exchange에 연결한다. 위의 Queue 추가 결과의 Name에 있는 [directQueue]를 클릭하여 바인딩 화면으로 진입 후 from exchange와 routing key를 지정한다.

Queue Binding

From exchange는 대상 큐를 의미하며 amq.direct는 direct 타입의 Exchange이다. direct는 특정 대상에 대한 연결이기 때문에 반드시 [Routing key]를 등록해야 한다.

Binding 결과는 Bindings 부분에서 확인 가능하다.

추가로 amq.fanout을 추가하는데 이때는 routing key를 생략한다. 마지막으로 amq.topic에는 sports.#이라고 입력하자.

 

topic의 wildcard


RabbitMQ의 
Topic Exchange는 메시지의 Routing Key와 큐를 바인딩할 때 사용하는 바인딩 키(Binding Key)의 패턴을 매칭시켜 메시지를 전달한다. 기본적으로 Topic Exchange에서 Routing Key는 반드시 점(.)으로 구분된 단어들의 집합이어야 한다.  (예: stock.usd.nysequick.orange.rabbit)

이때 패턴을 만들기 위해 두 가지 와일드카드를 사용한다.

1. * (별표)

  • 의미: 정확히 **단어 하나(1개)**를 대체한다.
  • 특징: 점(.)과 점 사이의 한 구간에 반드시 어떤 단어가 와야 할 때 사용
  • 예시: *.orange.*
    • quick.orange.rabbit (매칭 성공)
    • lazy.orange.elephant (매칭 성공)
    • orange.rabbit (매칭 실패 - 앞에 단어가 하나 더 있어야 함)
    • quick.orange.male.rabbit (매칭 실패 - *은 단어 하나만 담당하므로 중간에 단어가 더 있으면 안 됨)

2. # (우물 정/해시)

  • 의미: 0개 이상의 단어를 대체합니다.
  • 특징: 단어가 없어도 되고, 한 개여도 되고, 여러 개여도 상관없을 때 사용하는 가장 강력한 와일드카드
  • 예시: lazy.#
    • lazy.pink.rabbit (매칭 성공)
    • lazy.orange (매칭 성공)
    • lazy (매칭 성공 - 0개 단어도 포함하므로)
    • quick.lazy.rabbit (매칭 실패 - 시작이 lazy가 아님)

3. 기타

  • #만 사용했을 때: 바인딩 키를 # 하나로만 설정하면 루팅 키에 상관없이 모든 메시지를 받음. Fanout Exchange와 동일
  • 와일드카드를 쓰지 않았을 때: *이나 # 없이 정확한 단어만 사용하면 루팅 키가 정확히 일치해야 함. Direct Exchange와 동일

 

'Spring-Cloud' 카테고리의 다른 글

RabbitMQ - 2: 메시지 발신자  (0) 2026.02.02
01. OpenFeign 1  (0) 2026.01.24
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.