주요 메시징 플랫폼 비교
애플리케이션 간 메시지 교환을 효율적으로 처리하는 데 널리 사용되는 두 가지 메시징 브로커, Apache Kafka와 RabbitMQ를 비교 분석해 보겠습니다. 이 두 시스템의 핵심 특징과 차이점을 명확히 이해하는 데 도움이 될 것입니다.
RabbitMQ
RabbitMQ는 오픈 소스 메시지 브로커로서, 다양한 애플리케이션 간의 원활한 통신 및 메시지 교환을 지원합니다. Erlang 언어로 개발되어 뛰어난 경량성과 효율성을 자랑합니다. Erlang은 분산 시스템에 특화되어 설계된 언어입니다.
RabbitMQ는 전통적인 메시징 브로커로 분류됩니다. 게시자-구독자 패턴을 기반으로 작동하지만, 구성 설정에 따라 동기 또는 비동기 방식으로 통신을 처리할 수 있는 유연성을 제공합니다. 또한, 생산자와 소비자 간의 안정적인 메시지 전달 및 순서 보장을 지원합니다.
다양한 프로토콜(AMQP, STOMP, MQTT, HTTP 및 웹 소켓)을 지원하며, 메시지 교환을 위한 세 가지 주요 모델(토픽, 팬아웃, 직접)을 제공합니다.
- 특정 주제 또는 주제 패턴에 따라 메시지를 교환합니다. [topic]
- 큐에 연결된 모든 소비자에게 메시지를 브로드캐스트합니다. [fanout]
- 각 소비자가 특정 메시지를 수신합니다. [direct]
RabbitMQ의 주요 구성 요소는 다음과 같습니다.
생산자
생산자는 RabbitMQ로 메시지를 생성하고 전송하는 애플리케이션입니다. RabbitMQ에 연결하여 메시지를 게시할 수 있는 모든 종류의 애플리케이션이 될 수 있습니다.
소비자
소비자는 RabbitMQ에서 메시지를 수신하고 처리하는 애플리케이션입니다. RabbitMQ에 연결하여 메시지를 구독할 수 있는 모든 애플리케이션이 될 수 있습니다.
교환기
교환기는 생산자로부터 메시지를 수신하여 적절한 큐로 라우팅하는 역할을 합니다. 직접, 팬아웃, 주제, 헤더 교환과 같이 다양한 유형의 교환기가 있으며, 각각 고유한 라우팅 규칙을 가지고 있습니다.
대기열
대기열은 소비자가 메시지를 처리할 때까지 메시지가 저장되는 장소입니다. 메시지가 교환기에 게시될 때 애플리케이션에 의해 생성되거나 RabbitMQ에 의해 자동 생성됩니다.
바인딩
바인딩은 교환기와 대기열 간의 연결을 정의합니다. 메시지를 적절한 대기열로 라우팅하기 위해 교환기가 사용하는 메시지 라우팅 규칙을 지정합니다.
RabbitMQ의 구조
RabbitMQ는 풀 모델을 사용하여 메시지를 전달합니다. 풀 모델에서 소비자는 브로커에 메시지를 능동적으로 요청합니다. 메시지는 라우팅 키를 기반으로 해당 대기열로 라우팅하는 교환기에 게시됩니다.
RabbitMQ의 아키텍처는 클라이언트-서버 구조를 기반으로 하며, 안정적이고 확장 가능한 메시징 플랫폼을 제공하기 위해 여러 구성 요소가 협력하여 작동합니다. AMQP 개념은 교환기, 대기열, 바인딩, 게시자 및 구독자 구성 요소를 제공합니다. 게시자는 교환기에 메시지를 게시합니다.
교환기는 이러한 메시지를 가져와 특정 규칙(바인딩)에 따라 0개에서 여러 개의 대기열로 배포합니다. 대기열에 저장된 메시지는 소비자가 가져갈 수 있습니다. 간단히 말해, RabbitMQ에서 메시지 관리는 다음과 같이 수행됩니다.
이미지 출처: VMware
- 게시자는 메시지를 교환기로 전송합니다.
- 교환기는 메시지를 큐 및 다른 교환기로 보냅니다.
- 메시지를 수신하면 RabbitMQ는 게시자에게 확인 메시지를 보냅니다.
- 소비자는 RabbitMQ에 대한 지속적인 TCP 연결을 유지하고, 수신 중인 대기열을 선언합니다.
- RabbitMQ는 메시지를 소비자에게 라우팅합니다.
- 소비자는 메시지 수신 성공 또는 오류에 대한 확인 메시지를 보냅니다.
- 수신에 성공하면 메시지가 대기열에서 제거됩니다.
Apache Kafka
Apache Kafka는 LinkedIn에서 Scala 언어로 개발한 분산 오픈 소스 메시징 솔루션입니다. 확장성과 성능이 뛰어난 게시자-구독자 모델을 통해 메시지를 처리하고 저장할 수 있습니다.

수신된 이벤트나 메시지를 저장하기 위해, 파티션을 사용하여 주제를 여러 노드에 분산시킵니다. 게시자-구독자 및 메시지 대기열 패턴을 모두 결합하고 각 소비자의 메시지 순서를 확인하는 역할도 합니다.
Kafka는 실시간 데이터 스트림 처리에서 높은 데이터 처리량과 짧은 대기 시간을 우선시합니다. 이는 서버(브로커) 측에서 복잡한 로직과 특수 구현 세부 사항을 최소화함으로써 달성됩니다.
예를 들어, Kafka는 RAM을 사용하지 않고 서버의 파일 시스템에 데이터를 직접 기록합니다. 모든 데이터가 순차적으로 기록되므로 RAM에 준하는 읽기/쓰기 성능을 보여줍니다.
다음은 Kafka를 확장 가능하고 성능이 우수하며 내결함성을 갖도록 만드는 주요 개념입니다.
주제
주제는 메시지를 분류하고 레이블을 지정하는 방법입니다. 10개의 서랍이 있는 옷장을 상상해 보세요. 각 서랍이 주제가 될 수 있으며, 옷장은 Apache Kafka 플랫폼입니다. 메시지 그룹을 분류하는 것 외에도, 주제는 관계형 데이터베이스의 테이블과 유사하다고 볼 수도 있습니다.
생산자
생산자 또는 게시자는 메시징 플랫폼에 연결하여 특정 주제에 대한 메시지를 전송합니다.
소비자
소비자는 메시징 플랫폼에 연결하여 특정 주제에 대한 메시지를 소비합니다.
브로커
Kafka 플랫폼에서 브로커는 Kafka 그 자체를 의미하며, 주제 관리, 메시지 저장 방법 등을 정의합니다.
클러스터
클러스터는 확장성과 내결함성을 향상시키기 위해 상호 작용하는 브로커의 집합입니다.
로그 파일
각 주제는 로그 형식으로, 구조화되고 순차적인 방식으로 레코드를 저장합니다. 로그 파일은 특정 주제의 정보를 포함하는 파일입니다.
파티션
파티션은 주제 내에서 메시지를 분할하는 계층입니다. 이러한 분할은 Apache Kafka의 탄력성, 내결함성 및 확장성을 보장하며, 각 주제는 여러 위치에 여러 파티션을 가질 수 있습니다.
Apache Kafka의 구조
Kafka는 푸시 모델을 기반으로 메시지를 전달합니다. 이 모델에서 Kafka의 메시지는 소비자에게 능동적으로 푸시됩니다. 메시지는 주제에 게시되며, 클러스터 내의 여러 브로커에 걸쳐 분할 및 분산됩니다.
소비자는 하나 이상의 주제를 구독하고, 해당 주제에 대해 생성된 메시지를 수신할 수 있습니다.
Kafka에서 각 주제는 하나 이상의 파티션으로 나뉩니다. 파티션은 이벤트가 기록되는 최종 위치입니다.
클러스터에 하나 이상의 브로커가 있는 경우, 파티션은 가능한 한 모든 브로커에 고르게 분산되어, 하나의 주제에서 여러 브로커에 걸쳐 쓰기 및 읽기 로드를 확장할 수 있습니다. 클러스터는 동기화를 위해 ZooKeeper를 사용하여 실행됩니다.
Kafka는 레코드를 수신하고 배포합니다. 레코드는 이벤트 또는 정보가 될 수 있는 시스템 노드에서 생성된 데이터입니다. 클러스터로 전송된 후, 주제 파티션에 저장됩니다.
각 레코드에는 시퀀스 오프셋이 있으며, 소비자는 자신이 소비하는 오프셋을 제어할 수 있습니다. 따라서 주제를 다시 처리해야 하는 경우, 이 오프셋을 기반으로 작업을 수행할 수 있습니다.
이미지 출처: 위키피디아
마지막으로 읽은 메시지 ID 관리, 또는 새로 도착한 데이터를 쓸 파티션 결정과 같은 로직은 클라이언트(생산자 또는 소비자)로 이전됩니다.
생산자 및 소비자의 개념 외에도, 주제, 파티션, 복제와 같은 개념도 중요합니다.
주제는 메시지 범주를 설명합니다. Kafka는 주제 데이터를 복제하고, 주제를 여러 서버에 분할하여 확장함으로써 내결함성을 달성합니다.
RabbitMQ 대 Kafka
Apache Kafka와 RabbitMQ의 가장 큰 차이점은 이들 시스템에 구현된 메시지 전달 모델의 근본적인 차이에서 비롯됩니다.
특히, Apache Kafka는 소비자가 필요한 메시지를 주제에서 가져오는(pull) 방식으로 작동합니다.
반면에 RabbitMQ는 필요한 메시지를 수신자에게 전송하여 푸시 모델을 구현합니다. 따라서 Kafka는 다음과 같은 점에서 RabbitMQ와 차이를 보입니다.
#1. 아키텍처
RabbitMQ와 Kafka의 가장 큰 차이점 중 하나는 아키텍처의 차이입니다. RabbitMQ는 전통적인 브로커 기반 메시지 큐 아키텍처를 사용하는 반면, Kafka는 분산 스트리밍 플랫폼 아키텍처를 사용합니다.
또한, RabbitMQ는 풀 기반 메시지 전달 모델을 사용하고, Kafka는 푸시 기반 모델을 사용합니다.
#2. 메시지 저장
RabbitMQ는 메시지를 FIFO(선입선출) 대기열에 넣고, 대기열에서 메시지의 상태를 모니터링합니다. 반면, Kafka는 메시지를 로그에 추가(디스크에 기록)하고, 수신자는 주제에서 필요한 정보를 얻습니다.
RabbitMQ는 메시지가 수신자에게 전달된 후 메시지를 삭제하지만, Kafka는 로그 정리가 예약될 때까지 메시지를 저장합니다.
따라서 Kafka는 현재 및 과거의 시스템 상태를 저장하고, RabbitMQ와 달리 신뢰할 수 있는 기록 데이터 소스로 사용할 수 있습니다.
#3. 부하 분산
풀 메시지 전달 모델 덕분에 RabbitMQ는 대기 시간을 줄일 수 있습니다. 그러나 메시지가 처리할 수 있는 속도보다 빠르게 대기열에 도착하면 수신자가 과부하될 수 있습니다.
RabbitMQ에서는 각 수신자가 다른 수의 메시지를 요청/업로드하므로, 작업 분배가 고르지 않을 수 있으며, 이로 인해 처리 중에 메시지 순서가 지연되거나 손실될 수 있습니다.
이를 방지하기 위해 각 RabbitMQ 수신자는 누적된 미확인 메시지 수에 대한 제한인 프리페치 제한을 구성합니다. Kafka에서는 로드 밸런싱이 자동으로 수행됩니다. 주제의 섹션(파티션) 간에 수신자를 재분배하는 방식으로 수행됩니다.
#4. 라우팅
RabbitMQ는 큐잉을 위해 서로 다른 교환기로 라우팅하는 네 가지 방법을 제공하여 강력하고 유연한 메시징 패턴 세트를 지원합니다. Kafka는 라우팅 없이 메시지를 디스크에 쓰는 한 가지 방법만 구현합니다.
#5. 메시지 순서
RabbitMQ를 사용하면 임의의 이벤트 그룹에서 상대적인 순서를 유지할 수 있습니다. Apache Kafka는 복제된 로그(주제)에 메시지를 순차적으로 기록하여 확장성을 유지하면서 순서를 쉽게 보장합니다.
| 기능 | RabbitMQ | Kafka |
| 아키텍처 | 브로커에 연결된 디스크에 메시지 저장 | 분산 스트리밍 플랫폼 아키텍처 |
| 전달 모델 | 풀 기반 | 푸시 기반 |
| 메시지 저장 | 메시지를 저장하지 않음 | 주제에 기록하여 순서 유지 |
| 로드 밸런싱 | 프리페치 제한 구성 | 자동으로 수행 |
| 라우팅 | 라우팅하는 4가지 방법 포함 | 메시지를 라우팅하는 방법은 한 가지 |
| 메시지 순서 | 그룹에서 주문을 유지하도록 허용 | 쓰기를 통해 순서 유지 |
| 외부 프로세스 | 필요하지 않음 | Zookeeper 인스턴스 실행 필요 |
| 플러그인 | 다양한 플러그인 | 플러그인 지원이 제한됨 |
RabbitMQ와 Kafka는 모두 널리 사용되는 메시징 시스템이며, 각각 고유한 장점과 사용 사례를 가지고 있습니다. RabbitMQ는 유연하고 안정적이며 확장 가능한 메시징 시스템으로 메시지 큐에 탁월한 성능을 제공하므로, 안정적이고 유연한 메시지 전달이 필요한 애플리케이션에 이상적입니다.
반면, Kafka는 대량 데이터의 실시간 처리와 높은 처리량을 위해 설계된 분산 스트리밍 플랫폼으로, 실시간 데이터 처리 및 분석이 필요한 애플리케이션에 적합합니다.
RabbitMQ의 주요 사용 사례:
전자상거래

RabbitMQ는 전자 상거래 애플리케이션에서 재고 관리, 주문 처리 및 결제 처리와 같은 서로 다른 시스템 간의 데이터 흐름을 관리하는 데 사용됩니다. 많은 양의 메시지를 처리하고, 메시지가 안정적이고 올바른 순서로 전달되도록 보장할 수 있습니다.
의료
의료 산업에서 RabbitMQ는 전자 건강 기록(EHR), 의료 기기 및 임상 의사 결정 지원 시스템과 같은 서로 다른 시스템 간에 데이터를 교환하는 데 사용됩니다. 필요한 정보를 제때에 제공하여 환자 치료를 개선하고 오류를 줄이는 데 도움이 될 수 있습니다.
금융 서비스
RabbitMQ는 거래 플랫폼, 위험 관리 시스템 및 결제 게이트웨이와 같은 시스템 간의 실시간 메시징을 지원합니다. 트랜잭션을 빠르고 안전하게 처리하는 데 도움이 될 수 있습니다.
IoT 시스템
RabbitMQ는 IoT 시스템에서 서로 다른 장치와 센서 간의 데이터 흐름을 관리하는 데 사용됩니다. 대역폭이 제한되고 연결이 불안정한 환경에서도 데이터가 안전하고 효율적으로 전달되도록 보장할 수 있습니다.
Kafka는 대용량 데이터를 실시간으로 처리하도록 설계된 분산 스트리밍 플랫폼입니다.
Kafka의 주요 사용 사례
실시간 분석

Kafka는 실시간 분석 애플리케이션에서 생성된 데이터를 처리하고 분석하여 기업이 최신 정보를 기반으로 의사 결정을 내릴 수 있도록 합니다. 대용량 데이터를 처리하고, 가장 까다로운 애플리케이션의 요구 사항도 충족할 수 있도록 확장할 수 있습니다.
로그 집계
Kafka는 다양한 시스템 및 애플리케이션의 로그를 집계하여 기업이 실시간으로 문제를 모니터링하고 해결할 수 있도록 합니다. 또한 장기적인 분석 및 보고를 위해 로그를 저장하는 데 사용할 수도 있습니다.
머신러닝
Kafka는 머신러닝 애플리케이션에서 실시간으로 데이터를 모델로 스트리밍하여, 기업이 최신 정보를 기반으로 예측하고 조치를 취할 수 있도록 합니다. 머신러닝 모델의 정확성과 효율성을 개선하는 데 도움이 될 수 있습니다.
RabbitMQ와 Kafka에 대한 의견
RabbitMQ의 광범위하고 다양한 기능은 메시지 큐를 유연하게 관리할 수 있다는 장점을 제공하지만, 리소스 소비 증가와 그에 따른 부하 증가 시 성능 저하라는 단점도 수반합니다. 복잡한 시스템의 작동 모드를 고려할 때, 대부분의 경우 Apache Kafka가 메시지 관리에 더 적합한 도구입니다.
예를 들어, 지리적 예약, 클라이언트 메트릭, 로그 파일 및 분석을 고려하여 수십 개의 시스템 및 서비스에서 많은 양의 이벤트를 수집하고 집계해야 하는 경우, 정보 소스가 늘어날 가능성이 크므로 Kafka를 사용하는 것이 좋습니다. 하지만 빠른 메시징만 필요하다면 RabbitMQ도 충분히 제 역할을 할 것입니다!
Windows 및 Linux에서 Apache Kafka를 설치하는 방법에 대한 정보도 찾아보실 수 있습니다.