RabbitMQ 정리
RabbitMQ 는 AMQP를 기반으로 프로세스간 통신을 지원하는 메시징큐이다. 카프카만 사용하다 RabbitMQ 를 사용해야할 일이 있어서 블로그를 작성한다.
AMQP(Advanced Message Queuing Protocol) : 분산 시스템에서 메시지 브로커 시스템을 구현하기 위한 표준 프로토콜
1. RabbitMQ 의 구조
단순한 구조부터 세부적인 구조까지 알아보자.
Producer - Broker - Consumer
아주 기본적인 메시징 큐의 구조이다.
Producer(전달자)가 Broker(Queue)에 메시지를 전달하면 Consumer(소비자)가 메시지를 받는다.
-------------------------------------
다음은 좀 더 세부적인 구조이다.
Broker에 여러개의 Queue가 존재하면 내부에 Exchange가 메시지를 알맞게 Queue에 넣어준다.
여기서 Queue의 이름을 Topic(토픽)이라고 부른다.
- Exchange: 생산자가 전송한 메시지를 수신하고 매칭된 큐(queue)에 전달하는 역할을 수행함. Exchange는 생산자가 메시지를 전송할 때 메시지가 전송될 위치를 나타냄.
- Queue: 메시지를 저장하고 소비자가 메시지를 소비하는 대상. 큐는 메시지의 소비를 기다리는 버퍼 역할을 수행함.
- Binding: Exchange와 Queue를 연결하는 역할을 수행함. Exchange는 수신한 메시지를 Binding된 Queue로 전달.
- Virtual Host: RabbitMQ 서버 내부에서 논리적인 경계를 만들어 줌. 가상 호스트는 독립적인 Exchange, Queue, Binding 및 권한을 가짐.
- Connection: 생산자와 소비자 간의 연결을 나타냄. RabbitMQ 서버는 다수의 Connection을 지원하며, Connection 내부에서 다수의 Channel을 생성할 수 있음.
RabbitMQ에서 지원하는 Exchange
- Direct Exchange: 메시지를 routing key를 기반으로 매칭된 큐로 직접 전송.
- Fanout Exchange: 메시지를 바인딩된 모든 큐로 복사하여 전송.
- Topic Exchange: 메시지를 routing key와 패턴을 기반으로 매칭된 큐로 전송.
- Headers Exchange: 메시지의 header 값을 기반으로 매칭된 큐로 전송.
- System Exchange: RabbitMQ에서 자동으로 생성되는 특수한 Exchange.
Virtual host란?
RabbitMQ 서버 내부에서 논리적인 경계를 만들어 줌. Virtual Host는 독립적인 Exchange, Queue, Binding, 사용자 및 권한을 가짐. 즉, RabbitMQ 서버는 여러 개의 Virtual Host를 지원하여 하나의 RabbitMQ 서버에서 다수의 독립적인 메시지 브로커 시스템을 운영할 수 있음.
Virtual Host는 RabbitMQ 서버에 존재하는 다른 Virtual Host와 완전히 격리되어 있으며, 다른 Virtual Host와는 Exchange, Queue, Binding 및 사용자 등의 요소가 겹치지 않음. 따라서 하나의 RabbitMQ 서버에 여러 개의 Virtual Host를 사용하면 여러 개의 독립적인 메시지 브로커를 구축할 수 있음.
예를 들어, A, B, C 세 개의 Virtual Host가 RabbitMQ 서버에 존재한다고 가정해보겠습니다. 이 때 A Virtual Host에서 생성된 Exchange, Queue, Binding 등의 구성 요소는 B, C Virtual Host와는 격리되어 있으며, 각각의 Virtual Host에 대해서 독립적으로 관리됩니다. 또한, A Virtual Host에 대한 사용자 계정과 권한은 B, C Virtual Host와는 완전히 다르게 구성될 수 있습니다.
따라서, Virtual Host는 하나의 RabbitMQ 서버를 여러 개의 독립적인 메시지 브로커로 사용할 수 있도록 지원하는 RabbitMQ의 중요한 기능 중 하나입니다. Virtual Host를 이용하여 논리적인 경계를 만들어 구성하는 것으로, RabbitMQ의 보안성과 다양한 구성을 가능하게 합니다.
RabbitMQ와 Kafka의 차이?
RabbitMQ | Kafka | |
Throughput | 소규모 데이터에서 더 높은 성능 | 대규모 데이터에서 더 높은 성능 |
Latency | 소규모 데이터에서 낮은 Latency | 대규모 데이터에서 더 낮은 Latency |
Resource Usage | 낮음 | 높음 |
결론
RabbitMQ와 Kafka는 메시지 처리의 목적과 필요한 시스템 요구 사항에 따라 선택해야 합니다. RabbitMQ는 작은 메시지 처리에서 빠르고 경량화된 메시징 솔루션으로 적합하며, Kafka는 대규모 데이터 스트리밍 처리를 위한 솔루션으로 적합합니다.
RabbitMQ는 다음과 같은 기능을 통해 메모리 사용을 최소화하면서도 처리량이 높은 대규모 메시지를 처리할 수 있음
- 메모리 페이지 전환(Memory Paging): RabbitMQ는 메모리 페이지 전환(Memory Paging)을 사용하여 메모리 사용량을 최소화. 메모리 페이지 전환은 데이터를 디스크에서 메모리로 로드하고, 더 이상 사용하지 않을 때 다시 디스크에 저장하는 프로세스를 의미. RabbitMQ는 메모리에서 데이터를 읽고 쓰는 데 특히 효율적인 메모리 페이지 전환을 사용하여 메모리 사용량을 최적화.
- 메모리에 데이터 유지(Memory-Based Data Persistence): RabbitMQ는 메시지를 처리하는 동안 메모리에 데이터를 유지. 이를 통해 디스크에서 데이터를 읽어오거나 디스크에 데이터를 쓰는 데 필요한 시간을 절약할 수 있음. RabbitMQ는 데이터를 디스크에 저장하는 대신에 디스크를 백업 저장소로 사용하며, 메모리에만 데이터를 저장.
- 메시지 사전 할당(Message Pre-Allocation): RabbitMQ는 메시지를 처리하는 데 필요한 메모리를 미리 할당. 이를 통해 즉시 사용 가능한 메모리를 유지하면서 처리량을 높일 수 있음. RabbitMQ는 또한 메모리를 매우 효율적으로 사용하여 매우 적은 메모리를 사용하여 대규모 메시지를 처리할 수 있음.
- 메시지 우선순위 지정(Message Prioritization): RabbitMQ는 메시지 우선순위 지정을 지원하여 메시지가 처리되는 순서를 조정할 수 있음. 이를 통해 중요한 메시지를 우선 처리하고, 중요하지 않은 메시지를 나중에 처리할 수 있음. 이를 통해 처리량을 높일 수 있으며, 메모리 사용량을 줄일 수 있음.