[Distributed] Message Broker 비교: Kafka / RabbitMQ / NATS / SQS / Redis Streams
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 매트릭스
| 항목 | Kafka | RabbitMQ | NATS | SQS | Redis Streams | Google Pub/Sub |
|---|---|---|---|---|---|---|
| 모델 | log | exchange-queue | subject pub-sub | queue | log | topic pub-sub |
| 영속 | 항상 | 옵션 | 옵션 (JS) | 항상 | 옵션 | 항상 |
| Throughput | 수백만/s | 수만/s | 수백만/s | 거의 무한 (auto-scale) | 수십만/s | 수백만/s |
| Latency | 중간 (ms) | 낮음 | 마이크로초 | 수십 ms | 낮음 | 중간 |
| 운영 복잡도 | 높음 | 중간 | 낮음 | 없음 (managed) | 낮음 (Redis 운영자라면) | 없음 |
| 라우팅 | partition by key | exchange 패턴 | subject 계층 | FIFO/standard | consumer group | filtering |
| Re-play (재처리) | 자유 (offset) | 한 번만 | JS 가능 | DLQ 만 | 가능 (XREAD) | 가능 |
| 학습 곡선 | 높음 | 중간 | 낮음 | 낮음 | 낮음 | 낮음 |
| 비용 (자체호스팅) | 비쌈 | 중간 | 저렴 | - | 저렴 | - |
| 비용 (managed) | Confluent | CloudAMQP | Synadia | AWS | ElastiCache | GCP |
처리량 / 지연 / 운영비용 (직관)
Broker 처리량 vs 지연 (가상 직관)
NATS = 지연 최저. Kafka = 처리량 최고. SQS = 무한 확장이지만 지연 큼.
시나리오별 추천
| 시나리오 | 추천 |
|---|---|
| Event sourcing (큰 로그) | Kafka |
| 마이크로서비스 commands | NATS 또는 RabbitMQ |
| AWS Lambda + 큐 | SQS |
| Sidekiq 같은 Ruby job queue | Redis (list 기반) |
| 실시간 채팅 fan-out | NATS 또는 Redis Pub/Sub |
| CDC (DB → search) | Kafka + Debezium |
| 트래픽 spike 자동 흡수 | SQS (managed) |
| 빠른 mvp / startup | Redis Streams |
메시지 보장 비교
| Broker | At-most-once | At-least-once | Exactly-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 재설계) |
| RabbitMQ | Kafka | 중간 (라우팅 → topic 재설계) |
| Kafka | NATS | 작음 (둘 다 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 ( / / / ):…
💬 댓글