Apache Kafka의 핵심 개념과 동작 원리를 정리합니다.

아키텍처

Kafka Cluster (여러 Broker의 집합)
    │
    └─ Broker (카프카 서버, 여러 대 가능)
           │
           └─ Topic (메시지 종류)
                  │
                  ├─ Partition 0 ──┐
                  ├─ Partition 1 ──┼── Consumer Group A ─┬─ Consumer 1
                  └─ Partition 2 ──┘                     ├─ Consumer 2
                          │                              └─ Consumer 3
                          │
                          └──────────── Consumer Group B ─── Consumer 1

구성 요소

  • Broker: Kafka 서버 (여러 대로 클러스터 구성)
  • Topic: 메시지 종류별 논리적 그룹
  • Partition: 토픽 내 병렬 처리 단위
  • Consumer Group: 동일 group.id로 묶인 컨슈머들

설계 시 고려사항

  • 파티션 수 = 최대 병렬 처리 수
  • 파티션 수 ≥ 컨슈머 수 (컨슈머가 더 많으면 일부는 idle)

메시지 흐름

Producer ──produce──▶ Kafka Broker ◀──poll── Consumer
                                                  │
                                                  ▼
                                              consume
                                              처리 로직

동작 방식

  1. Producer가 메시지 전송
  2. Broker가 파티션에 메시지 저장
  3. Consumer가 주기적으로 폴링
  4. 새 메시지 있으면 가져와서 처리

메시지 관리

Offset 관리

  • Offset: 파티션 내 메시지 위치 (0부터 시작)
  • Committed Offset: 처리 완료한 마지막 위치
  • Latest Offset: 파티션의 마지막 메시지 위치
  • Consumer Lag: Latest - Committed (처리 지연 정도)

Commit 전략

// 자동 커밋 (기본값)
enable.auto.commit=true
auto.commit.interval.ms=5000

// 수동 커밋
consumer.commitSync();
consumer.commitAsync();

메시지 전달 보장

1. At-most-once

  • 처리 전 commit
  • 장점: 중복 없음
  • 단점: 메시지 유실 가능

2. At-least-once (기본값)

  • 처리 후 commit
  • 장점: 메시지 유실 없음
  • 단점: 중복 처리 가능
  • 중요: 애플리케이션 레벨에서 멱등성 보장 필요

3. Exactly-once

  • 트랜잭션 사용
  • 장점: 중복도 유실도 없음
  • 단점: 성능 오버헤드

메시지 보관

일반 메시지 큐와 달리 Kafka는 consume 후에도 메시지 보관:

# 시간 기반 (기본 7일)
log.retention.hours=168

# 용량 기반
log.retention.bytes=1073741824

# 압축 정책
log.cleanup.policy=delete  # 기본값
log.cleanup.policy=compact # 키 기반 압축

장점

  • 재처리 가능
  • 여러 컨슈머 그룹이 독립적으로 소비
  • 장애 복구 용이

정리

Kafka는 높은 처리량과 확장성을 제공하는 분산 메시징 시스템입니다. 특히:

  • 파티션을 통한 병렬 처리
  • 컨슈머 그룹을 통한 부하 분산
  • 메시지 보관을 통한 재처리 지원

이 특징들이 대용량 실시간 데이터 처리에 적합한 이유입니다.