Blog / Architecture / Message Queue 비교 분석

Message Queue 비교 분석

1. Message Queue Solutions 비교
AWS SQS RabbitMQ Apache Kafka Apache ActiveMQ Eclipse Mosquitto
도입 구분 관리형 (Amazon SQS) 설치형 오픈소스, 관리형 (Amazon MQ) 설치형 오픈소스, 관리형 (Amazon MSK) 설치형 오픈소스, 관리형 (Amazon MQ) 설치형 오픈소스, 관리형 (Amazon IoT Core)
메시지 모델 일반 Queue, FIFO Queue Queue Topic Topic, Queue Topic
주요 특징 Proprietary 프로토콜, AWS 완전 관리형, 높은 가용성 및 확장성 AMQP 프로토콜 구현, 다양한 메시지 패턴 지원 (direct/fanout/topic 등), 풍부한 기능과 확장성 Proprietary 프로토콜, 분산 스트리밍 플랫폼, 대용량 고성능 내결함성 확장성 JMS 표준 구현, 다양한 메시지 라우팅 패턴 지원, Java 기반 경량 메시지 브로커로 MQTT 프로토콜 구현, 자원 소모 적음, IoT/M2M 환경 주로 사용
비교 / 우위 및 장점
AWS SQS RabbitMQ Apache Kafka Apache ActiveMQ Eclipse Mosquitto
우위 및 장점 완전 관리형, 러닝커브 낮음, 신속한 배포/확장, DLQ로 실패 메시지 확인 편리, 서버리스 및 AWS 기반 통합 용이, FIFO 큐 메시지 순서 보장 다양한 언어 지원, 엔터프라이즈 환경 적합, 다양한 기능, 높은 성능 및 안정성, 다양한 확장 옵션 오픈소스 중 가장 풍부한 에코시스템, 대규모 이벤트 스트리밍, 브로커 클러스터링 Scale Out/In, 메시지 영속 저장 및 분산 데이터 처리 중점 클러스터링 및 다양한 라우팅 패턴, JMS/OpenWire/MQTT/STOMP 프로토콜 지원, Java 애플리케이션과 상호운용성 우수, 메시지 필터링/선택/변환/그루핑 기능 단순한 구조, 경량으로 빠른 메시지 전달, QoS 설정 가능
성능 및 운영 이슈 메시지당 256KB 용량 제한, FIFO 큐 초당 3,000개 제한, 일반 큐 순서 보장 안됨, 대용량 데이터 스트리밍 부적합 설정/관리 복잡, 다수 Consumer 간 순서 보장 안됨, 대용량 시 자원 사용량 증가 설정/관리 복잡, Topic 내 메시지 순서 보장 안됨 (같은 파티션 내에서는 보장), 대용량 시 자원 사용량 크게 증가 특정 Queue 순서 보장 설정 가능하나 Topic은 보장 안됨, 대규모 고성능 시나리오에서 Kafka보다 확장성 낮음 대규모/높은 처리량 요구사항에 부적합, IoT 이외에는 레퍼런스 빈약
분산 처리 구조
AWS SQS RabbitMQ Apache Kafka Apache ActiveMQ Eclipse Mosquitto
분산 처리 Queue에 메시지는 단 한번 소비되고 삭제 Exchange에서 Fanout/Topic 타입 바인딩으로 여러 Queue에 발행 가능, 메시지 단 한번 소비 후 삭제 Consumer Group 단위로 소비, 같은 Group 내 중복 없음, 여러 Group이 동일 메시지 수신 가능 Queue: 단 한번 소비 후 삭제, Topic: 구독하는 모든 Consumer에 전달 발행된 메시지는 Topic 구독하는 모든 Consumer에서 소비

2. AWS SQS 메시지 처리 구조

AWS SQS
AWS SQS

  • Queue(대기열)를 생성하고 Producer가 Queue에 메시지 전송 → Consumer가 Pull 수신 처리
  • Point-to-Point만 지원: 하나의 메시지를 여러 Consumer가 동시에 중복 수신 불가
  • 메시지는 단 한번 소비되며 처리 완료 시 삭제
  • 처리 실패한 메시지는 삭제되지 않고 Dead-Letter Queue(DLQ) 로 Redrive되어 재처리 대기

3. RabbitMQ 메시지 처리 구조

RabbitMQ
RabbitMQ

  • Broker는 Exchange와 Message Queue로 구성
  • Producer → Exchange → (Routing Key & Binding 규칙) → Queue → Consumer
  • 메시지는 단 한번 소비 후 삭제
Exchange 3가지 타입

Direct

Direct
Direct

  • Routing Key와 Binding Key가 정확히 일치하는 경우에만 Queue로 송신
  • 1개의 Queue를 수신하는 Consumer가 여러 개면 번갈아 수신

Fanout

Fanout
Fanout

  • Routing Key 관계없이 Exchange에 Binding된 모든 Queue에 메시지 송신

Topic

Topic
Topic

  • 와일드카드를 이용해 Binding, Routing Key 매핑으로 메시지 라우팅
  • * = 1개 단어, # = 0개 이상 단어

4. Apache Kafka 메시지 처리 구조

Apache Kafka
Apache Kafka

  • Producer → Topic (여러 Partition으로 구성, 기본 Round Robin 분산) → Consumer Group
  • 같은 Partition 내에서는 순서 보장, 다른 Partition 간에는 순서 보장 안됨
  • Consumer Group 단위로 메시지 수신: 다른 MQ와 달리 같은 메시지를 여러 Group이 각각 수신 가능
  • Consumer 인스턴스 추가/제거 시 자동 Rebalancing → Scale In/Out 용이

5. Apache ActiveMQ 메시지 처리 구조

Apache ActiveMQ
Apache ActiveMQ

  • P2P: Queue의 메시지는 단 하나의 Consumer 인스턴스에서만 소비, 처리 후 삭제
  • Pub/Sub: Topic의 메시지는 구독하는 모든 Consumer에 동시 전달

6. Eclipse Mosquitto 메시지 처리 구조

Eclipse Mosquitto
Eclipse Mosquitto

  • Producer → Broker의 Topic → 해당 Topic을 구독하는 모든 Device에 메시지 전달

7. Pub/Sub 패턴 분산처리 가상 개발 시나리오

시나리오: Producer에서 인버터 장비 상태 메시지를 발행 → User / Equipment / Event / Contents 4개 도메인 시스템이 구독하여 각자 비즈니스 처리

SQS

SQS
SQS

  • 도메인 시스템 갯수별로 Queue 생성
  • Queue당 메시지 한번 소비 후 삭제 → Scale Out 시 중복 처리 부담 적음
  • Producer가 복수의 Queue 대상으로 메시지를 발행해야 하므로 트랜잭션 처리 유념 필요
RabbitMQ

RabbitMQ
RabbitMQ

  • 도메인 시스템 갯수별로 Queue 생성 (SQS와 동일 Flow)
  • Exchange가 복수 Queue 라우팅을 담당 → Producer는 Routing Key만 맞춰 Broker에 한번만 전송
  • Exchange의 라우팅/바인딩 규칙 관리가 운영 이슈
Apache Kafka

Apache Kafka
Apache Kafka

  • Topic 1개 생성, 데이터 처리량 기준으로 Partition 설정 (보통 3개)
  • 도메인 시스템별 Consumer Group 설정, 구독 Topic에 연결
  • Consumer Group 단위로 메시지 수신 → 같은 Group 내 중복 처리 부담 적음
Apache ActiveMQ

Apache ActiveMQ
Apache ActiveMQ

  • 일부 도메인에만 전송할 경우: 시스템 갯수별 Queue 생성 후 Producer 발행
  • 모든 시스템에 전송할 경우: Topic을 통해 발행
  • Topic은 모든 Consumer 인스턴스에 메시지 수신 → Scale Out 시 중복 메시지 처리 방안 강구 필요

8. 솔루션 채택 기준

Echo System - Trend
Echo System - Trend

평가표
AWS SQS RabbitMQ Apache Kafka Apache ActiveMQ Eclipse Mosquitto
애플리케이션 적합성
가용성 ▲▲ ▼▼
분산처리 성능 ▲▲▲ ▲▲ -
유지보수성
자원소비량
분산처리 성능 순위

Apache Kafka > Apache ActiveMQ > RabbitMQ > SQS

자원소비량 순위

Apache Kafka > RabbitMQ = Apache ActiveMQ > MQTT > SQS


9. SQS vs MSK vs EC2-Kafka 비교
SQS MSK EC2-Kafka
데이터 영속성 삭제 시까지 유지 삭제 시까지 유지
보관 기간 60초~14일 default 7일 (수정 가능)
프로토콜 HTTP/HTTPS, SDK Kafka 프로토콜
기본 전달방식 FIFO 순서보장 동일 파티션 내 순서 보장 (키 미지정 시 round robin)
성능 초당 최대 300개 무제한 (비용만큼 처리)
메시지 size limit 256KB 8MB default 1MB
보안 IAM IAM SSL/TLS
모니터링 CloudWatch CloudWatch 없음 (OS 모니터링만)
비용 백만건 프리티어, 이후 백만건당 $0.4 월 $72.85 + 네트워크 비용 (kafka.t3.small×2, 50GB) 월 $58.20 + 네트워크 비용 (t4g.small×3, 50GB)
설정 복잡도 상대적으로 낮음 중간 상대적으로 높음
선택 기준 1:1 메시지 큐잉 M:N 메시지 큐잉

10. 분산처리 구조 제안
  • 고가용성 / 분산처리 효율성 최우선 → Apache Kafka

    • 오픈소스 중 가장 풍부한 레퍼런스
    • 자원 사용량은 타 솔루션과 현격한 차이 없음
    • 운영 러닝커브와 복잡성은 감안 필요
  • 유지보수성 / 편리성 최우선 → AWS SQS

    • 성능 제약과 분산처리 시 개발 부담이 있으나 유지보수성과 비용 측면에서 유리
  • MQTT(Mosquitto) 는 서버 애플리케이션 간 인터페이스에는 적합하지 않음

최종 제안

다중 분산처리 니즈가 크지 않고 Monolithic에 가깝다면 → SQS

대용량 데이터 분산처리와 시스템 확장성/고가용성을 고려한다면 → Apache Kafka

서버 애플리케이션 간 인터페이스는 Apache Kafka 또는 SQS, Mobile Device 대상 메시지 발행 시는 AWS IoT 일부 도입

  • Case 1
    Case 1
    Case 1
  • Case 2
    Case 2
    Case 2
Written by
author
풍우래기

여행을 좋아하는 집돌이 개발자입니다.

블로그에 새로운 글이 발행되었습니다.