Kafka란 무엇인가
한 줄 정의
Apache Kafka는 분산 이벤트 스트리밍 플랫폼입니다. 대용량 데이터를 실시간으로 발행(publish)하고, 저장하고, 소비(consume)할 수 있습니다.
메시지 큐 vs Pub/Sub vs 이벤트 스트리밍
메시지 큐 (Message Queue)
Producer → [Queue] → Consumer
↓
소비 후 삭제
- 메시지를 소비자 하나가 처리
- 처리 후 메시지 삭제
- 작업 분배에 적합 (RabbitMQ, SQS)
Pub/Sub
Publisher → [Broker] → Subscriber A
→ Subscriber B
→ Subscriber C
- 발행된 메시지를 모든 구독자가 수신
- 소비 후 삭제 (보통)
이벤트 스트리밍 (Kafka)
Producer → [Kafka Topic] → Consumer Group A
→ Consumer Group B
→ Consumer Group C
↓
설정 기간 동안 보존 (재소비 가능)
- 여러 소비자 그룹이 독립적으로 소비
- 메시지가 보존 — 과거 시점부터 다시 읽기 가능
- 로그 기반 저장 구조
Kafka가 해결하는 문제
Before Kafka — 스파게티 연결
서비스 A ─────→ 서비스 B
서비스 A ─────→ 서비스 C
서비스 A ─────→ 서비스 D
서비스 B ─────→ 서비스 C
서비스 B ─────→ 서비스 D
...
- N개 시스템이 서로 직접 연결 → N² 연결
- 각 시스템이 소비자 시스템의 API/프로토콜을 알아야 함
- 소비자 장애 시 생산자도 영향 받음
After Kafka — 허브 연결
서비스 A ─→ [Kafka] ─→ 서비스 B
서비스 B ─→ ─→ 서비스 C
서비스 C ─→ ─→ 서비스 D
- 생산자와 소비자 완전 분리 (Decoupling)
- 생산자는 Kafka에만 쓰면 됨
- 소비자는 Kafka에서만 읽으면 됨
- 소비자가 늘어도 생산자 변경 불필요
Kafka의 핵심 특징
1. 로그 기반 저장 (Append-only Log)
오프셋: 0 1 2 3 4
[msg] [msg] [msg] [msg] [msg] →
↑
새 메시지는 항상 뒤에 추가
- 메시지를 순서대로 디스크에 추가
- 기존 메시지 수정/삭제 없음 (불변)
- 순차 I/O → 디스크에서도 빠름
- 특정 오프셋부터 다시 읽기 가능
2. Pull 기반 소비
- 소비자가 직접 가져감 (pull)
- RabbitMQ 등은 브로커가 push
- Pull의 장점:
- 소비자가 자신의 속도에 맞게 소비
- 소비자 장애 시 브로커에 부담 없음
- 배치 처리 최적화 가능
3. 수평 확장
- 파티션 분산 — 하나의 토픽을 여러 파티션으로 나눠 여러 브로커에 분산
- 브로커 추가 → 선형적 처리량 증가
- 소비자 추가 → 병렬 처리 증가 (파티션 수 이내)
4. 고내구성
- 복제(Replication) — 동일 파티션을 여러 브로커에 복제
- 브로커 장애 → 자동 리더 전환
acks=all+min.insync.replicas→ 데이터 유실 없음
주요 사용 사례
실시간 데이터 파이프라인
MySQL (Debezium CDC) → Kafka → Elasticsearch (검색)
→ S3 (데이터 레이크)
→ Redshift (분석)
기존 배치 ETL 대비 실시간 데이터 전달.
마이크로서비스 이벤트 통신
주문 서비스 → [order.created] → 결제 서비스
→ 재고 서비스
→ 알림 서비스
서비스 간 직접 호출 없이 이벤트 기반 통신.
이벤트 소싱 (Event Sourcing)
User.created → [user-events]
User.updated →
User.deleted →
(재생하면 현재 상태 복원 가능)
상태 변경을 이벤트로 저장 — 언제든 재생 가능.
로그 집계 / 모니터링
서버 A 로그 → Kafka → Logstash → Elasticsearch
서버 B 로그 →
서버 C 로그 →
분산 서버의 로그를 중앙에서 수집.
스트림 처리 (실시간 분석)
클릭 이벤트 → Kafka Streams → 실시간 대시보드
결제 이벤트 → → 이상 탐지
CDC (Change Data Capture)
DB 변경 (INSERT/UPDATE/DELETE) → Debezium → Kafka → 다운스트림 시스템
DB 변경을 이벤트로 스트리밍.
전통적 메시지 브로커와 차이
| Kafka | RabbitMQ | ActiveMQ | |
|---|---|---|---|
| 저장 방식 | 로그 (보존) | 큐 (소비 후 삭제) | 큐 (소비 후 삭제) |
| 소비 모델 | Pull | Push | Push/Pull |
| 재소비 | 오프셋으로 가능 | 기본 불가 | 기본 불가 |
| 처리량 | 매우 높음 (초당 수백만) | 중간 (초당 수만) | 중간 |
| 순서 보장 | 파티션 내 | 큐 단위 | 큐 단위 |
| 라우팅 | 파티션 키 | Exchange 타입 다양 | 다양 |
| 스트림 처리 | Kafka Streams 내장 | 없음 | 없음 |
| 주 용도 | 이벤트 스트리밍 | 작업 큐, RPC | 엔터프라이즈 메시징 |
Kafka 생태계
┌─────────────────────────────────────────┐
│ Kafka Core │
│ Broker + ZooKeeper/KRaft + Clients │
└─────────────────────────────────────────┘
↑ ↓
┌─────────────┐ ┌──────────────────┐
│ Kafka │ │ Kafka Streams │
│ Connect │ │ (스트림 처리) │
│ (데이터 │ │ │
│ 통합) │ └──────────────────┘
└─────────────┘
↑
┌─────────────────┐
│ Schema Registry │
│ (스키마 관리) │
└─────────────────┘
- Kafka Core: 브로커, 토픽, 파티션, 복제
- Kafka Connect: 외부 시스템 ↔ Kafka 커넥터 프레임워크
- Kafka Streams: Kafka 위의 스트림 처리 라이브러리
- Schema Registry: Avro/Protobuf 스키마 중앙 관리
정리
- Kafka는 분산 이벤트 스트리밍 플랫폼 — 로그 기반 저장, pull 소비, 재소비 가능
- 시스템 간 결합도 제거 — 생산자/소비자 독립적 확장
- 메시지 큐(RabbitMQ)와 달리 메시지를 보존 — 여러 소비자 그룹이 독립적으로 소비
- 높은 처리량, 수평 확장, 고내구성이 핵심 강점
- 실시간 파이프라인, 이벤트 기반 마이크로서비스, 이벤트 소싱, 스트림 처리에 적합