hobokai 님의 블로그

RabbitMQ 완벽 가이드 1편: 기초 개념과 설치 본문

Data Platform

RabbitMQ 완벽 가이드 1편: 기초 개념과 설치

hobokai 2025. 7. 23. 15:41

목차

  1. RabbitMQ란?
  2. 핵심 아키텍처
  3. 설치 방법
  4. 기본 개념 이해
  5. 다음 편 미리보기

RabbitMQ란?

RabbitMQ는 AMQP(Advanced Message Queuing Protocol)를 구현한 오픈소스 메시지 브로커입니다. LinkedIn에서 개발한 Kafka와 달리, RabbitMQ는 다양한 메시징 패턴을 지원하며 특히 마이크로서비스 아키텍처에서 널리 사용됩니다.

왜 RabbitMQ를 선택해야 할까요?

안정성과 신뢰성

  • 메시지 지속성과 전달 확인 보장
  • 클러스터링을 통한 고가용성 제공

유연성

  • 다양한 메시징 패턴 지원 (pub/sub, point-to-point, RPC)
  • 여러 프로토콜 지원 (AMQP, MQTT, STOMP)

관리 편의성

  • 직관적인 웹 관리 인터페이스
  • 풍부한 모니터링 기능

생태계

  • 다양한 언어 클라이언트 라이브러리
  • 플러그인 시스템으로 확장 가능

주요 사용 사례

🎯 마이크로서비스 간 통신
📊 비동기 작업 처리
📝 이벤트 기반 아키텍처
🔄 시스템 간 데이터 동기화
📱 실시간 알림 시스템

핵심 아키텍처

주요 구성 요소

1. Producer (생산자)

메시지를 RabbitMQ로 전송하는 애플리케이션입니다.

2. Consumer (소비자)

큐에서 메시지를 받아 처리하는 애플리케이션입니다.

3. Queue (큐)

메시지가 저장되는 버퍼입니다. 소비자가 처리할 때까지 메시지를 보관합니다.

4. Exchange (교환기)

라우팅 규칙에 따라 메시지를 적절한 큐로 전달하는 라우터입니다.

5. Binding (바인딩)

Exchange와 Queue를 연결하는 규칙입니다.

6. Virtual Host (vhost)

멀티 테넌시를 위한 논리적 분리 단위입니다.

메시지 흐름

Producer → Exchange → Queue → Consumer

상세 흐름:

  1. Producer가 Exchange에 메시지 전송
  2. Exchange가 바인딩 규칙에 따라 Queue로 라우팅
  3. Queue에 메시지 저장
  4. Consumer가 Queue에서 메시지 소비
  5. 처리 완료 후 ACK(확인) 신호 전송

설치 방법

Docker 설치 (권장)

가장 빠르고 간편한 방법입니다.

# RabbitMQ with 관리 플러그인 실행
docker run -d --name rabbitmq \
  -p 5672:5672 \
  -p 15672:15672 \
  -e RABBITMQ_DEFAULT_USER=admin \
  -e RABBITMQ_DEFAULT_PASS=admin123 \
  rabbitmq:3-management

# 설치 확인
docker ps

# 관리 인터페이스 접속
# http://localhost:15672 (admin/admin123)

Ubuntu 네이티브 설치

# RabbitMQ 리포지토리 추가
curl -fsSL https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc | sudo apt-key add -
echo "deb https://dl.bintray.com/rabbitmq/debian $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/rabbitmq.list

# 설치
sudo apt update
sudo apt install rabbitmq-server

# 관리 플러그인 활성화
sudo rabbitmq-plugins enable rabbitmq_management

# 서비스 시작
sudo systemctl enable rabbitmq-server
sudo systemctl start rabbitmq-server

# 상태 확인
sudo systemctl status rabbitmq-server

Windows 설치

# Chocolatey 사용
choco install rabbitmq

# 또는 공식 사이트에서 다운로드
# https://www.rabbitmq.com/download.html

기본 사용자 설정

# 관리자 사용자 생성
sudo rabbitmqctl add_user admin admin123
sudo rabbitmqctl set_user_tags admin administrator
sudo rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

# 사용자 목록 확인
sudo rabbitmqctl list_users

# 기본 guest 사용자는 보안상 삭제 권장 (프로덕션)
sudo rabbitmqctl delete_user guest

기본 개념 이해

Connection과 Channel

Connection (연결)

  • 클라이언트와 RabbitMQ 브로커 간 TCP 연결
  • 인증과 권한 부여 담당

Channel (채널)

  • Connection 내부의 가상 연결
  • 실제 AMQP 명령어 실행
  • 하나의 Connection에 여러 Channel 생성 가능
import pika

# 연결 생성
connection = pika.BlockingConnection(
    pika.ConnectionParameters('localhost')
)

# 채널 생성
channel = connection.channel()

# 큐 선언
channel.queue_declare(queue='hello')

# 연결 종료
connection.close()

큐 속성

Durable (지속성)

  • 브로커 재시작 시 큐 보존 여부
  • True: 큐 메타데이터 디스크에 저장

Exclusive (독점성)

  • 하나의 연결에서만 사용 가능
  • 연결 종료 시 자동 삭제

Auto-delete (자동 삭제)

  • 모든 소비자가 연결을 끊으면 자동 삭제
# 지속성 있는 큐 생성
channel.queue_declare(
    queue='persistent_queue',
    durable=True,
    exclusive=False,
    auto_delete=False
)

메시지 속성

Delivery Mode

  • 1: 비지속적 (메모리에만 저장)
  • 2: 지속적 (디스크에 저장)

Priority

  • 메시지 우선순위 (0-255)

TTL (Time To Live)

  • 메시지 생존 시간
# 지속적 메시지 전송
channel.basic_publish(
    exchange='',
    routing_key='persistent_queue',
    body='Hello World!',
    properties=pika.BasicProperties(
        delivery_mode=2,  # 메시지 지속성
        timestamp=int(time.time()),
        priority=5
    )
)

Quality of Service (QoS)

소비자가 한 번에 처리할 수 있는 미확인 메시지 수를 제한합니다.

# 한 번에 하나의 메시지만 처리
channel.basic_qos(prefetch_count=1)

이렇게 설정하면 소비자가 이전 메시지 처리를 완료하고 ACK를 보낼 때까지 새로운 메시지를 받지 않습니다.

실습: 첫 번째 메시지 전송

producer.py

import pika

# 연결 설정
connection = pika.BlockingConnection(
    pika.ConnectionParameters('localhost')
)
channel = connection.channel()

# 큐 선언
channel.queue_declare(queue='hello')

# 메시지 전송
channel.basic_publish(
    exchange='',
    routing_key='hello',
    body='안녕하세요 RabbitMQ!'
)

print(" [x] 메시지를 전송했습니다")
connection.close()

consumer.py

import pika

def callback(ch, method, properties, body):
    print(f" [x] 받은 메시지: {body.decode()}")

# 연결 설정
connection = pika.BlockingConnection(
    pika.ConnectionParameters('localhost')
)
channel = connection.channel()

# 큐 선언 (안전을 위해 중복 선언)
channel.queue_declare(queue='hello')

# 소비자 설정
channel.basic_consume(
    queue='hello',
    on_message_callback=callback,
    auto_ack=True
)

print(' [*] 메시지를 기다리는 중입니다. 종료하려면 CTRL+C를 누르세요')
channel.start_consuming()

관리 인터페이스 활용

웹 브라우저에서 http://localhost:15672에 접속하면:

Overview 탭

  • 시스템 전체 상태
  • 메시지 처리량 그래프
  • 노드 정보

Connections 탭

  • 활성 연결 목록
  • 연결별 상세 정보

Channels 탭

  • 활성 채널 목록
  • 채널별 메시지 통계

Queues 탭

  • 큐 목록과 상태
  • 메시지 수, 소비자 수
  • 큐 관리 기능

Exchanges 탭

  • Exchange 목록
  • 바인딩 관계 확인

다음 편 미리보기

2편: Exchange와 라우팅 패턴에서는 다음 내용을 다룹니다:

🔄 Exchange 타입별 상세 설명

  • Direct Exchange: 정확한 라우팅 키 매칭
  • Topic Exchange: 와일드카드 패턴 매칭
  • Fanout Exchange: 브로드캐스트 방식
  • Headers Exchange: 헤더 기반 라우팅

📊 메시징 패턴 구현

  • Work Queue (작업 분산)
  • Publish/Subscribe (발행/구독)
  • RPC 패턴

💻 실전 예제

  • 로그 시스템 구축
  • 이메일 알림 시스템
  • 이미지 처리 파이프라인

RabbitMQ의 기초를 탄탄히 다졌다면, 이제 실제 메시징 패턴을 구현해볼 시간입니다. 2편에서는 더욱 실용적인 예제와 함께 RabbitMQ의 강력한 라우팅 기능을 살펴보겠습니다.