메시지 브로커는 시스템 간의 메시지 전달을 관리하는 중간 계층 소프트 웨어로, 메시지를 보내는 프로듀서(Producer)와 메시지를 소비하는 컨슈머(Consumer)와는 별개의 서버에서 구동된다.
이를 통해 메시지 송수신을 효율적으로 처리하고, 시스템의 결합도를 낮추며 수평적 확장성을 용이하게 한다. 때문에 빠른 응답보다는 안전한 메시지 전달, 노드 간의 독립성, 확장성을 필요로 하는 서비스들인 이메일, 로그 수집, 온라인 결제, 마이크로 서비스 등에 매우 유용하게 활용된다.
메시지를 전달하는 방식은 크게 2가지가 있다.


*Message Queue: 자료구조 Queue를 사용하여 메시지를 관리하는 시스템으로, Point-to-Point 모델 외에도 Pub/Sub 모델과 같은 다른 패턴도 지원할 수 있다.
| RabbitMQ | Kafka |
|---|---|
| MessageBroker | EventBroker |
| In-Memory MessageBroker | LogBased MessageBroker |
| Message Queueing System | Streaming Processing System |
| Tranditional Message Queue | Distributed Streaming Platform |
| Message Queue Model-Based | Publish-SubScribe Model-Based |
1. RabbitMQRabbitMQ는 기본적으로 큐 기반 시스템(Queue-based)에 속하는 메시지 브로커이다.
이 시스템에서 브로커는 생산자로부터 메시지를 받아 큐에 저장하고, 소비자가 메시지를 가져가면 해당 메시지를 큐에서 제거한다. 이와 같은 동작 방식 때문에 RabbitMQ는 종종 "smart broker, dumb consumer"라고 묘사된다.
RabbitMQ는 메시지를 주로 메모리에 저장하기 때문에 처리 속도가 빠르지만, 동시에 메시지 유실의 위험성이 있다. 물론 디스크 저장 옵션을 활성화하면 메시지가 디스크에 저장되어 유실 위험을 줄일 수 있지만, 소비자가 메시지를 확인하면 그 메시지는 큐에서 삭제되므로, 이후 다시 읽을 수 없다.
장점
- 메시지의 순차적 처리가 보장됨
- 메시지 우선순위와 만료 설정 등이 가능
- 신뢰성 있는 메시지 전달을 위해 확인 응답을 지원하며, 컨슈머가 메시지를 성공적으로 처리했음을 브로커에 전달하여 안정적인 처리가 가능함
- 작업 큐(Work Queue) 방식으로, 여러 컨슈머가 각자 작업을 분배받아 처리하는 방식이 유용함
예시) 이미지 처리와 같은 병렬 작업을 분산 처리할 수 있음단점:
- 메시지가 큐에서 소비되면 즉시 삭제되므로, 메시지의 재전송이나 내구성에 한계가 있을 수 있음
- 클러스터링이 복잡함. 각 컨슈머가 메시지를 소비하고 큐에서 삭제되는 작업을 다른 노드들과 실시간으로 동기화해야 하므로 클러스터 환경에서의 관리가 어려울 수 있음
2. KafkaKafka는 Pub/Sub 모델을 기반으로 한 로그 기반 시스템으로, 메시지를 디스크에 순차적으로 기록한다.
각 메시지는 고유한 오프셋을 가지고 있으며, 소비자는 이를 통해 메시지를 읽고, 자신이 마지막으로 읽은 위치를 추적할 수 있다. 이렇게 기록된 메시지는 소비자가 읽어도 삭제되지 않으며, 설정된 보존 기간 동안 디스크에 저장된다. 따라서 큐 시스템과 달리 메시지를 재처리하거나 다시 읽을 수 있는 유연성을 제공한다.
*로그 기반 시스템: 메시지나 데이터를 순차적으로 기록하고 시간 순서대로 보관하는 시스템으로, 메시지를 순차적으로 기록하고 읽는 방식은 디스크 I/O 효율성을 높이고, 고속의 데이터 처리를 가능하게 한다.
장점:
- 메시지는 디스크에 영구 저장되어 유실이 없고, 여러 번 처리할 수 있음
- 컨슈머가 오프셋을 관리해 장애 발생 시 실패 지점부터 재처리가 가능하며, 분산 운영이 용이
- 배치 처리를 통해 대량 데이터를 효율적으로 처리할 수 있음
단점:
- 메시지 순서 보장과 저지연 처리가 중요한 애플리케이션에서는 RabbitMQ가 더 유리할 수 있음
- Kafka에서는 소비자가 오프셋을 관리해야 하며, 메시지 재처리나 오프셋 동기화가 필요할 수 있어 컨슈머 구현이 복잡할 수 있음
RabbitMQ는 비동기 작업 처리, 작업 큐, RPC 등에 적합하며, 주로 요청/응답 및 작업 분배 시스템에 사용된다. 단기적인 메시지 처리가 필요한 환경, 예를 들어 주문 처리, 비디오 인코딩, 작업 분배 시스템 등에 유용하다.
Kafka는 대규모 실시간 데이터 스트리밍과 이벤트 기반 아키텍처에 적합하며, 로그 수집, 데이터 파이프라인, 분석 시스템 등에 사용된다. 높은 내구성, 수평 확장성, 메시지 재처리 기능을 제공해 지속적인 로그 처리에 유리하다.
참고