
들어가며
이번 글에서는 대표적인 메시지 브로커인 RabbitMQ의 개념부터 Kubernetes 환경에서의 구축, 그리고 Spring Boot 애플리케이션과의 연동까지 단계별로 알아보겠습니다.
RabbitMQ는 AMQP(Advanced Message Queuing Protocol)를 구현한 오픈소스 메시지 브로커입니다. Erlang으로 개발되었으며, 높은 가용성과 확장성을 제공하는 Enterprise급 메시징 시스템입니다.
Producer (발행자)
메시지를 생성하고 RabbitMQ에 전송하는 애플리케이션입니다. 주문 처리, 이메일 발송 요청 등의 작업을 큐에 넣는 역할을 합니다.
Queue (큐)
메시지가 저장되는 버퍼입니다. Producer가 보낸 메시지는 Queue에 저장되고, Consumer가 가져갈 때까지 대기합니다.
Consumer (소비자)
Queue에서 메시지를 받아 처리하는 애플리케이션입니다. 실제 비즈니스 로직을 수행하는 주체입니다.
Exchange (교환기)
Producer가 보낸 메시지를 어떤 Queue로 라우팅할지 결정하는 라우터 역할을 합니다.
Binding (바인딩)
Exchange와 Queue 사이의 연결 규칙입니다. 라우팅 키를 통해 메시지 전달 경로를 결정합니다.
안정성 (Reliability)
메시지 지속성(Durability)과 확인 응답(Acknowledgment) 메커니즘을 통해 메시지 손실을 방지합니다.
유연한 라우팅
다양한 Exchange 타입(Direct, Topic, Fanout, Headers)을 통해 복잡한 메시지 라우팅을 지원합니다.
클러스터링
여러 노드를 클러스터로 구성하여 고가용성과 확장성을 제공합니다.
관리 도구
웹 기반 관리 UI를 통해 Queue, Exchange, 메시지 상태를 실시간으로 모니터링할 수 있습니다.
다양한 클라이언트 지원
Java, Python, .NET, Go, JavaScript 등 다양한 언어를 지원합니다.
비동기 작업 처리
이벤트 기반 아키텍처
서비스 간 결합도 감소
로드 밸런싱
민감한 정보인 사용자명과 비밀번호를 안전하게 저장하기 위해 Secret을 생성합니다.
# rabbitmq-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: rabbitmq-secret
namespace: msa-apps
type: Opaque
stringData:
username: <ID>
password: <PW>
Secret 사용의 장점
RabbitMQ 서버와 데이터 영속성을 위한 스토리지를 설정합니다.
# rabbitmq-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: rabbitmq
namespace: msa-apps
spec:
replicas: 1
selector:
matchLabels:
app: rabbitmq
template:
metadata:
labels:
app: rabbitmq
spec:
containers:
- name: rabbitmq
image: rabbitmq:3.11-management
ports:
- containerPort: 5672 # AMQP 프로토콜
- containerPort: 15672 # 관리 UI
env:
- name: RABBITMQ_DEFAULT_USER
valueFrom:
secretKeyRef:
name: rabbitmq-secret
key: username
- name: RABBITMQ_DEFAULT_PASS
valueFrom:
secretKeyRef:
name: rabbitmq-secret
key: password
resources:
requests:
memory: "256Mi"
cpu: "200m"
limits:
memory: "512Mi"
cpu: "500m"
volumeMounts:
- name: rabbitmq-data
mountPath: /var/lib/rabbitmq
volumes:
- name: rabbitmq-data
persistentVolumeClaim:
claimName: rabbitmq-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rabbitmq-pvc
namespace: msa-apps
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
주요 설정 설명
클러스터 내부 통신과 외부 관리 UI 접근을 위한 서비스를 생성합니다.
# rabbitmq-service.yaml
apiVersion: v1
kind: Service
metadata:
name: rabbitmq
namespace: msa-apps
spec:
type: ClusterIP
ports:
- port: 5672
targetPort: 5672
name: amqp
- port: 15672
targetPort: 15672
name: http
selector:
app: rabbitmq
---
# 관리 UI 접근을 위한 NodePort 서비스
apiVersion: v1
kind: Service
metadata:
name: rabbitmq-management
namespace: msa-apps
spec:
type: NodePort
ports:
- port: 15672
targetPort: 15672
nodePort: 31672
name: http
selector:
app: rabbitmq
서비스 타입 설명
# 시크릿 생성
kubectl apply -f rabbitmq-secret.yaml
# 배포 및 PVC 생성
kubectl apply -f rabbitmq-deployment.yaml
# 서비스 생성
kubectl apply -f rabbitmq-service.yaml
# 배포 상태 확인
kubectl get pods -n msa-apps -l app=rabbitmq
kubectl get services -n msa-apps | grep rabbitmq
중앙 집중식 설정 관리를 위해 Config Service에 RabbitMQ 공통 설정을 추가합니다.
# config-service/configurations/rabbitmq.yml
spring:
rabbitmq:
host: rabbitmq
port: 5672
username: <ID>
password: <PW>
virtual-host: /
listener:
simple:
concurrency: 3
max-concurrency: 10
retry:
enabled: true
initial-interval: 1000ms
max-attempts: 3
max-interval: 10000ms
multiplier: 2.0
설정 항목 설명
각 마이크로서비스의 build.gradle에 RabbitMQ 의존성을 추가합니다.
dependencies {
// 기존 의존성들...
// RabbitMQ 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-amqp'
// 기존 의존성들...
}
각 서비스의 application.yml에 RabbitMQ 프로필을 포함시킵니다.
# 예: health-service application.yml
spring:
application:
name: health-service
config:
import: configserver:http://config-service:8888
profiles:
include: rabbitmq # RabbitMQ 프로필 포함
URL: http://공인IP:31672
계정: ID / PW
주요 기능
Queue 메트릭
Connection 메트릭
Node 메트릭
마치며
RabbitMQ는 MSA 환경에서 서비스 간 안정적이고 확장 가능한 통신을 제공하는 핵심 인프라입니다. Kubernetes 환경에서의 배포와 Spring Boot 애플리케이션과의 연동을 통해 강력한 이벤트 기반 아키텍처를 구축할 수 있습니다.
이처럼 비동기 메시징을 통해 시스템의 확장성과 안정성을 크게 향상시킬 수 있으며, 서비스 간 결합도를 낮춰 유지보수성도 개선할 수 있습니다