본문으로 건너뛰기
김신건의 로그

[Distributed] Message Broker 비교: Kafka / RabbitMQ / NATS / SQS / Redis Streams

· 수정 · 📖 약 1분 · 488자/단어 #message-broker #kafka #rabbitmq #nats #sqs #comparison
message broker comparison, Kafka vs RabbitMQ, broker selection

결정 트리

flowchart TD
    Q1{사용 패턴}
    Q1 -->|event log + replay| Kafka[Kafka]
    Q1 -->|복잡 라우팅 + task queue| Rabbit[RabbitMQ]
    Q1 -->|마이크로서비스 가벼움| NATS[NATS]
    Q1 -->|AWS managed + 단순 큐| SQS[SQS]
    Q1 -->|Redis 위 fan-out / 짧은 큐| RedisS[Redis Streams]
    Q1 -->|클라우드 native pub-sub| GCP[Google Pub/Sub]

6가지 broker 매트릭스

항목KafkaRabbitMQNATSSQSRedis StreamsGoogle Pub/Sub
모델logexchange-queuesubject pub-subqueuelogtopic pub-sub
영속항상옵션옵션 (JS)항상옵션항상
Throughput수백만/s수만/s수백만/s거의 무한 (auto-scale)수십만/s수백만/s
Latency중간 (ms)낮음마이크로초수십 ms낮음중간
운영 복잡도높음중간낮음없음 (managed)낮음 (Redis 운영자라면)없음
라우팅partition by keyexchange 패턴subject 계층FIFO/standardconsumer groupfiltering
Re-play (재처리)자유 (offset)한 번만JS 가능DLQ 만가능 (XREAD)가능
학습 곡선높음중간낮음낮음낮음낮음
비용 (자체호스팅)비쌈중간저렴-저렴-
비용 (managed)ConfluentCloudAMQPSynadiaAWSElastiCacheGCP

처리량 / 지연 / 운영비용 (직관)

Broker 처리량 vs 지연 (가상 직관)
NATS = 지연 최저. Kafka = 처리량 최고. SQS = 무한 확장이지만 지연 큼.

시나리오별 추천

시나리오추천
Event sourcing (큰 로그)Kafka
마이크로서비스 commandsNATS 또는 RabbitMQ
AWS Lambda + 큐SQS
Sidekiq 같은 Ruby job queueRedis (list 기반)
실시간 채팅 fan-outNATS 또는 Redis Pub/Sub
CDC (DB → search)Kafka + Debezium
트래픽 spike 자동 흡수SQS (managed)
빠른 mvp / startupRedis Streams

메시지 보장 비교

BrokerAt-most-onceAt-least-onceExactly-once
Kafka옵션기본EOS 가능
RabbitMQ옵션persistent + ack외부 idempotency 필요
NATS Core기본--
NATS JS-기본옵션
SQS-기본FIFO + 5분 dedup
Redis Streams-XACK 로외부 idempotency

IMPORTANT

Exactly-once 는 broker 내부 에서만 의미 있음. 외부 시스템 (DB, API) 까지 완벽한 exactly-once 는 불가능. idempotency + outbox 가 현실적 정답. 자세한 건 outbox-pattern, idempotency-keys.

영속 / 재처리 비교

flowchart TD
    Kafka[Kafka<br/>days~weeks retention<br/>임의 offset replay]
    Rabbit[RabbitMQ<br/>queue 안의 메시지<br/>소비 = 사라짐]
    Nats[NATS JS<br/>retention 정책<br/>임의 시점 replay]
    Sqs[SQS<br/>최대 14일<br/>한 번 소비 = 사라짐]
    Stream[Redis Streams<br/>MAXLEN 만큼<br/>임의 offset]

마이그레이션 비용

출발도착비용
Sidekiq (Redis)Kafka큼 (consumer group, exactly-once 재설계)
RabbitMQKafka중간 (라우팅 → topic 재설계)
KafkaNATS작음 (둘 다 log)
자체 호스팅Managed작음 (운영 측면 큰 이득)

운영자 시점 체크리스트

✓ 메시지 손실 허용?              (acks, persistent, ack 정책)
✓ 순서 보장 필요?                 (partition key, FIFO)
✓ 재처리 가능?                    (offset / position)
✓ DLQ + parking lot              (실패 메시지 격리)
✓ Backpressure                   (prefetch, max-in-flight)
✓ Monitoring                     (lag, dead messages, throughput)
✓ Consumer auto-scaling          (lag 기반)

관련 위키

이 글의 용어 (7개)
[AWS] SQS: managed queue, FIFO, DLQcloud
정의 SQS = AWS 의 완전 관리형 메시지 큐. infinite scale, no provisioning, pay-per-request. Standard vs FIFO | |…
[Distributed] Kafka: 분산 로그, partition, consumer groupdistributed-systems
정의 Apache Kafka = 분산 commit log. 고처리량 (수백만 msg/s), 영속, 수평 확장. event-driven 아키텍처 의 de facto. 핵심 개념: …
[Distributed] NATS: 가벼움, JetStream, subject 라우팅distributed-systems
정의 NATS = 극도로 가벼운 메시징 시스템. core NATS = at-most-once Pub/Sub + request-reply. JetStream = 영속 / at-le…
[Distributed] RabbitMQ: exchange, queue, routing keydistributed-systems
정의 RabbitMQ = AMQP 0.9.1 기반 traditional message broker. exchange → queue 라우팅, workload distribution…
[Pattern] Idempotency Keys: 중복 요청 안전 처리distributed-systems
정의 Idempotency = 같은 요청을 N번 보내도 결과가 1번과 동일. 분산 시스템 / 결제 / API 의 안전망. [!IMPORTANT] 네트워크는 항상 timeout /…
[Pattern] Outbox Pattern: DB + 메시지의 원자성distributed-systems
정의 Outbox Pattern = DB 변경 + 메시지 발행 의 원자성 보장. 이중 쓰기 (dual write) 문제 의 표준 해결. 문제: Dual Write | 시나리오 |…
[Redis] Pub/Sub vs Streams: 휘발 신호 vs 영속 로그database-internals
정의 - Pub/Sub ( / ): 지금 듣고 있는 구독자 에게만 메시지가 전달되는 휘발성 신호. 영속 없음, ACK 없음. fan-out. - Streams ( / / / ):…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기