
RabbitMQ 란?
- RabbitMQ 는 메시지 브로커입니다.
메시지 브로커는 데이터(메시지)를 송신자(프로듀서)로부터 수신자(컨슈머)에게 전달하는 중간 매개체 역할을
합니다.
- RabbitMQ 는 이러한 메시지를 큐(queue) 에 저장하고, 필요할 때 적절한 수신자에게 전달합니다.
RabbitMQ 의 역할
비동기 처리
- 데이터를 비동기적으로 처리하여 시스템의 응답성을 높입니다.
부하 분산
- 여러 소비자에게 메시지를 분산시켜 시스템의 부하를 균형 있게 분산합니다.
내결함성
- 메시지를 안전하게 저장하여 시스템 장애 시 데이터 손실을 방지합니다.
장점
신뢰성 (Reliability)
- 메시지 지속성
- RabbitMQ 는 메시지 디스크에 저장하여 시스템 장애 발생 시에도 메시지가 손실되지 않도록 합니다.
- 확인 메커니즘
- 메시지가 성공적으로 소비자에게 전달되었는지 확인하는 ACK(acknowledgment) 메커니즘을 지원
유연성 (flexibility)
- 다양한 메시지 패턴
- RabbitMQ 는 여러가지 메시지 전달 패턴(단일 소비자, 다중 소비자, RR, 팬아웃, 주제 기반 등)을 지원
- 프로토콜 지원
- 기본적으로 AMQP(Advanced Message Queuing Protocol) 를 사용하지만,
STOMP, MQTT 등 다양한 프로토콜도 지원합니다.
확장성 (Scalability)
- 클러스터링
- RabbitMQ 는 클러스터링을 통해 여러 노드로 구성된 환경에서 높은 가용성과 부하 분산을 제공합니다.
- 분산 아키텍처
- 페더레이션(federation) 및 셰어드 노딩(sharded nodes)을 통해 분산된 메시징 시스템을 구축할 수
있습니다.
관리 및 모니터링(Manageability and Monitoring)
- 관리 인터페이스
- 웹 기반 관리 인터페이스를 통해 큐, 익스체인지, 바인딩 등을 쉽게 관리할 수 있습니다.
- 플러그인 시스템
- 다양한 플러그인을 통해 기능을 확장할 수 있습니다.
(예시: 관리 플러그인, 모니터링 플러그인 등)
- 높은 처리량
- 적절히 구성된 RabbitMQ 는 높은 메시지 처리량을 제공하여 대규모 애플리케이션에서도 효과적으로
사용할 수 있습니다.
단점
설정 및 운영 복잡성 (Setup and Operational Complexity)
- 복잡한 설정
- RabbitMQ 의 초기 설정이 다소 복잡할 수 있으며, 클러스터링 및 분산 환경에서는 더욱 많은 설정이
필요합니다.
- 운영 관리
- 대규모 환경에서 RabbitMQ 를 운영하고 관리하는 데 있어서 추가적인 노력이 필요할 수 있습니다.
- 메시지 브로커 오버헤드
- RabbitMQ 는 모든 메시지를 중앙 브로커를 통해 전달하기 때문에, 높은 트래픽 상황에서는 브로커의
오버헤드가 발생할 수 있습니다.
- 대규모 메시지 처리
- 매우 대규모의 메시지를 처리할 때 성능 저하가 발생할 수 있으며, 이러한 경우에는 적절한 클러스터링 및
최적화가 필요합니다.
- 클러스터링이란?
클러스터링(Clustering)은 비슷한 특성을 가진 데이터를 그룹화하는 기계 학습 기법입니다.
데이터를 여러 그룹(클러스터)으로 나누되, 같은 그룹에 속한 데이터는 서로 유사하고,
다른 그룹에 속한 데이터는 서로 다르도록 분류합니다.
운영 비용 (Operational Costs)
- 리소스 소비
- RabbitMQ 는 메모리와 CPU 자원을 많이 소비할 수 있어, 충분한 리소스를 제공해야 원활하게
운영될 수 있습니다.
- 모니터링 및 유지보수
- 지속적인 모니터링과 유지보수가 필요하며, 이를 위해 추가적인 인력과 비용이 발생할 수 있습니다.
제한된 메시지 크기 (Limited Message Size)
- 메시지 크기 제한
- RabbitMQ 는 매우 큰 메시지 처리에 제한이 있을 수 있으며, 대용량 파일 전송에는 적합하지 않을 수
있다.
러닝 커브 (Learning Curve)
- 학습 필요성
- RabbitMQ 의 개념과 설정을 이해하는데 시간이 걸릴 수 있습니다.
RabbitMQ의 기본 구성 요소
메시지 (Message)
- 메시지는 RabbitMQ 를 통해 전달되는 데이터 단위입니다.
예를 들어, 사용자 등록 정보나 주문 내역이 메시지가 될 수 있습니다.
프로듀서 (Producer)
- 메시지를 생성하고 RabbitMQ 에 보내는 역할을 합니다.
예를 들어, 웹 애플리케이션이 사용자 등록 정보를 RabbitMQ 에 보내는 경우 프로듀서가 됩니다.
큐 (Queue)
- 메시지를 저장하는 장소입니다.
메시지는 큐에 저장되었다가 소비자에게 전달됩니다.
큐는 FIFO 방식으로 메시지를 처리합니다.
컨슈머 (Consumer)
- 큐에서 메시지를 가져와 처리하는 역할을 합니다.
예를 들어, 이메일 발송 서비스가 큐에서 사용자 등록 정보를 가져와 환영 이메일을 보내는 경우 컨슈머가
됩니다.
익스체인지 (Exchange)
- 메시지를 적절한 큐로 라우팅하는 역할을 합니다.
프로듀서는 메시지를 직접 큐에 보내지 않고, 익스체인지에 보내며, 익스체인지는 메시지를 적절한 큐로
전달합니다.
RabbitMQ와 AMQP
- RabbitMQ 는 AMQP(Advanced Message Queuing Protocol)를 사용합니다.
- AMQP 는 메시지 브로커를 위한 프로토콜로, 메시지의 생성, 전송, 큐잉, 라우팅 등을 표준화하여 메시지 브로커가 상호 운용될 수 있게 합니다.
- 여기서 프로토콜(Protocol)은 컴퓨터 네트워크에서 데이터를 주고받기 위한 일련의 규칙과 절차를 말합니다.
쉽게 말해, 컴퓨터나 장치들이 서로 통신할 때 어떻게 소통해야 하는지를 정해놓은 약속입니다.
AMQP 의 주요 개념
Message
Queue
Exchange
Binding
- 익스체인지와 큐를 연결하는 설정입니다.
바인딩을 통해 메시지가 어느 큐로 전달될지 정의합니다.
익스체인지 유형
- 메시지 브로커가 메시지를 교환기에서 큐로 라우팅하는 방식입니다.
- 익스체인지는 다양한 방식으로 메시지를 라우팅할 수 있으며, 주로 메시지의 라우팅 키와 바인딩 키 또는 패턴을 기반으로 작동합니다.
1. Direct Exchange (사용)
- 라우팅 키가 정확히 일치하는 큐로 메시지를 전달합니다.
- 예를 들어, 라우팅 키가 error 인 메시지는 error 라는 바인딩 키를 가진 큐로 전달됩니다.
2. Topic Exchange
- 라우팅 키의 패턴을 사용하여 메시지를 라우팅합니다.
패턴에는 와일드카드 * (단어 하나)와 # (0개 이상의 단어)가 사용됩니다.
- 예를 들어, 라우팅 키가
quick.orange.rabbit
인 메시지는 바인딩 키가 **.orange.*
로 전달됩니다.*
3. Fanout Exchange
- 라우팅 키를 무시하고 교환기에 바인딩된 모든 큐로 메시지를 브로드캐스트합니다.
- 모든 바인딩된 큐로 메시지가 전달됩니다.
- 라우팅 키 대신 메시지의 헤더를 기반으로 메시지를 라우팅합니다.
- 헤더 값과 바인딩된 헤더 값이 일치하는 큐로 메시지를 전달합니다.