1. RabbitMQ 개요
- RabbitMQ는 오픈소스 메시지 브로커이며, 메시지 기반 비동기 통신을 지원합니다.
- AMQP(Advanced Message Queuing Protocol) 기반이지만, MQTT, STOMP, HTTP 등 다양한 프로토콜도 지원합니다.
- 주 목적: 서비스 간 메시지 전달, 비동기 처리, 부하 분산, 이벤트 기반 아키텍처 지원.
2. 아키텍처 구성 요소
2.1 Producer / Consumer
- Producer: 메시지를 생성하고 큐에 발행.
- Consumer: 큐에서 메시지를 받아 처리.
- RabbitMQ는 producer와 consumer 간 직접 연결을 막고 큐를 통해 느슨하게 연결.
2.2 Queue (큐)
- 메시지가 저장되는 공간.
- FIFO(First In, First Out) 기본 원칙.
- Durable, Exclusive, Auto-delete 등 속성 설정 가능.
- Durable: 브로커 재시작 후에도 큐 유지
- Exclusive: 해당 연결만 사용 가능
- Auto-delete: 마지막 consumer 종료 시 큐 자동 삭제
2.3 Exchange (교환기)
- 메시지를 큐로 라우팅하는 역할.
- 종류:
- Direct: 라우팅 키와 정확히 매칭되는 큐로 전달
- Fanout: 모든 바인딩된 큐에 브로드캐스트
- Topic: 패턴 기반 라우팅 (logs.*, user.#)
- Headers: 헤더 속성 기반 라우팅
- Binding: Exchange와 Queue 간의 연결 규칙
2.4 Virtual Host (vhost)
- RabbitMQ 내 논리적 격리 공간.
- 각 vhost는 사용자, 큐, 익스체인지, 권한을 독립적으로 가짐.
- 대규모 서비스에서 멀티테넌시 구현 시 유용.
2.5 Connection & Channel
- Connection: TCP 기반 연결, 비용이 크므로 최소화.
- Channel: Connection 내 논리적 세션, 경량. 대부분 메시징은 channel 단위로 수행.
3. 메시지 흐름
- Producer가 메시지를 Exchange에 발행
- Exchange가 Binding 규칙과 라우팅 키를 통해 Queue 선택
- 메시지가 Queue에 저장
- Consumer가 Queue에서 메시지 읽기
- 메시지 Ack/Nack 처리 → Ack 시 삭제, Nack 시 재처리
Acknowledgement (Ack): 메시지 손실 방지
- autoAck=false: consumer가 처리 후 브로커에 Ack 보내야 삭제
- 재시도/Dead Letter Queue(DLQ) 구현 가능
4. 메시지 신뢰성
- Durable Queue + Persistent Message → 브로커 재시작 후에도 메시지 유지
- Acknowledgement → 메시지 처리 보장
- Publisher Confirms → producer가 메시지 안전 전송 여부 확인
- Dead Letter Exchange (DLX) → 처리 실패 메시지 관리
5. 메시지 전달 패턴
- Work Queue: 한 메시지를 한 consumer만 처리 (부하 분산)
- Publish/Subscribe: 여러 consumer가 메시지 받음 (Fanout)
- Routing: 특정 consumer에게 메시지 전달 (Direct/Topic)
- RPC (Remote Procedure Call): reply queue와 correlation ID 활용 동기식 요청/응답
6. 성능 최적화
- Persistent vs Transient 메시지: 디스크 I/O 차이
- Prefetch Count: 한 consumer가 동시에 가져오는 메시지 수 제한
- Cluster: 여러 노드로 브로커 확장, 큐 미러링 가능
- Flow Control: backpressure를 통해 memory 압박 조절
7. 보안
- 인증: Username/Password, LDAP, OAuth 2.0
- 권한: vhost 단위로 큐/익스체인지 접근 제어
- TLS 암호화: AMQP over TLS 지원
- 정책: 메시지 TTL, 큐 최대 길이 제한
8. 관리
- Management Plugin: Web UI 제공
- 큐 상태, 메시지 수, consumer, 채널 모니터링
- CLI Tools: rabbitmqctl, rabbitmq-diagnostics 등
- Metrics: Prometheus, Grafana 연동 가능
9. 장점
- 안정적인 메시징, 다양한 패턴 지원
- 다중 프로토콜 지원
- 미러링/클러스터링으로 고가용성 구현
- 풍부한 관리 UI, 모니터링 도구
10. 단점/주의점
- 매우 높은 처리량 필요 시 CPU/Memory 부담
- 브로커 설계 및 큐 설계 중요 (너무 많은 큐, 지나친 미러링은 성능 저하)
- 메시지 순서 보장과 Ack 관리 필요