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 변경을 이벤트로 스트리밍.


전통적 메시지 브로커와 차이

KafkaRabbitMQActiveMQ
저장 방식로그 (보존)큐 (소비 후 삭제)큐 (소비 후 삭제)
소비 모델PullPushPush/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)와 달리 메시지를 보존 — 여러 소비자 그룹이 독립적으로 소비
  • 높은 처리량, 수평 확장, 고내구성이 핵심 강점
  • 실시간 파이프라인, 이벤트 기반 마이크로서비스, 이벤트 소싱, 스트림 처리에 적합