Apache Kafka · 핵심 개념 정리

분산 이벤트
스트리밍 플랫폼

실시간 데이터 파이프라인과 스트리밍 애플리케이션을 위한 분산 메시지 브로커 — Kafka의 구조부터 운영 패턴까지.

고처리량 내구성 수평 확장 낮은 레이턴시
핵심 구성 요소

📨 Topic

메시지를 분류하는 논리적 채널. 파일 시스템의 폴더와 유사하며, 메시지는 특정 토픽으로 발행된다. 토픽은 여러 파티션으로 나뉜다.

논리적 채널

🗂️ Partition

토픽을 물리적으로 분할한 단위. 각 파티션은 순서가 보장된 불변 레코드 시퀀스이며, 브로커에 분산 저장된다. 병렬 처리의 기본 단위.

병렬 처리 단위

📤 Producer

토픽에 메시지를 발행하는 클라이언트. 키(key)를 기반으로 파티션을 선택하거나 라운드로빈 방식으로 분산한다. acks 설정으로 신뢰성 수준을 조정.

메시지 발행자

📥 Consumer

토픽에서 메시지를 구독하는 클라이언트. 오프셋을 통해 읽은 위치를 추적하며, Consumer Group으로 묶여 파티션을 나눠 처리한다.

메시지 소비자

🖥️ Broker

Kafka 서버 프로세스. 메시지를 디스크에 저장하고 Producer/Consumer의 요청을 처리한다. 여러 브로커가 모여 클러스터를 구성한다.

Kafka 서버

👥 Consumer Group

동일한 group.id를 공유하는 컨슈머 집합. 각 파티션은 그룹 내 한 컨슈머에만 할당되어 중복 없이 처리된다. 수평 확장의 핵심 메커니즘.

수평 확장

📍 Offset

파티션 내 메시지의 고유 순번(0부터 시작). 컨슈머는 오프셋을 커밋하여 처리 위치를 기록한다. 재처리(replay)가 필요할 때 오프셋을 조정한다.

위치 포인터

🏛️ ZooKeeper / KRaft

Kafka 2.x까지는 ZooKeeper로 클러스터 메타데이터를 관리. Kafka 3.x부터는 KRaft(내장 Raft 합의)로 ZooKeeper 의존성을 제거, 단순화.

클러스터 코디네이션

🔁 Replication

파티션을 여러 브로커에 복제하여 내구성 확보. Leader가 읽기/쓰기를 담당하고, Follower는 복제만 수행. replication.factor로 복제 수 설정.

내결함성
컴포넌트 역할 비교
컴포넌트 역할 주요 속성 / 설정 스케일 단위
Broker 메시지 저장 및 전달, 클러스터 구성원 log.dirs, num.partitions, log.retention.hours 브로커 수 증가
Topic 메시지 논리 채널, 파티션 컨테이너 replication.factor, retention.ms, cleanup.policy 파티션 수 조정
Partition 물리 저장 단위, 순서 보장 범위 segment.bytes, index.interval.bytes 병렬도 결정 요소
Producer 메시지 직렬화·배치·압축 후 브로커 전송 acks, batch.size, linger.ms, compression.type 인스턴스 수 증가
Consumer 파티션 구독, 오프셋 관리, 역직렬화 group.id, auto.offset.reset, max.poll.records 파티션 수 이내
KRaft Controller 메타데이터 관리, 리더 선출, 토픽 생성 controller.quorum.voters, metadata.log.dir 홀수 개 권장 (3/5)
메시지 흐름 다이어그램
Producer serialize + batch send() Broker (Topic) P-0 0 1 2↑ Leader P-1 0↑ 1 Leader P-2 0 1↑ Leader poll() Consumer Group Consumer-0 P-0 담당 Consumer-1 P-1 담당 Consumer-2 P-2 담당 offset commit

↑ = 현재 레코드 기록 위치(오프셋). 각 Consumer는 파티션 1개씩 전담.

Producer / Consumer 핵심 설정
Producer Config (Java)
// 신뢰성 설정
props.put("acks", "all");        // 전체 ISR 확인
props.put("retries", 3);
props.put("enable.idempotence", "true");

// 성능 설정
props.put("batch.size", 16384);
props.put("linger.ms", 5);
props.put("compression.type", "snappy");
Consumer Config (Java)
// 그룹 및 오프셋 설정
props.put("group.id", "my-group");
props.put("auto.offset.reset", "earliest");
props.put("enable.auto.commit", "false");

// 처리량 설정
props.put("max.poll.records", 500);
props.put("fetch.min.bytes", 1024);
props.put("session.timeout.ms", 30000);
CLI — 토픽 생성 / 모니터링
# 토픽 생성 (파티션 3, 복제 2)
$ kafka-topics.sh --create \
    --topic my-topic \
    --partitions 3 \
    --replication-factor 2 \
    --bootstrap-server localhost:9092

# 컨슈머 그룹 오프셋 확인
$ kafka-consumer-groups.sh --describe \
    --group my-group \
    --bootstrap-server localhost:9092

# LAG 모니터링 (미처리 메시지 수)
TOPIC     PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG
my-topic  0          1024            1029            5
my-topic  1          882             882             0
my-topic  2          1200            1201            1
메시지 전달 보장 수준
🔁
At-Least-Once
메시지가 최소 1회 전달됨을 보장. 네트워크 오류 시 재시도하므로 중복 수신 가능. 멱등성 처리가 필요.
At-Most-Once
메시지가 최대 1회 전달. 유실 가능성 있음. acks=0 또는 오프셋 선커밋(pre-commit) 방식. 고속·비중요 데이터에 적합.
Exactly-Once (EOS)
Kafka Transactions + 멱등 프로듀서로 구현. enable.idempotence=true, transactional.id 설정 필요. 가장 강력하나 오버헤드 있음.
Kafka vs 기타 솔루션 / 주요 활용 패턴

🟢 Kafka가 적합한 경우

  • 초당 수십만~수백만 건 이벤트 처리
  • 여러 컨슈머가 동일 토픽을 독립 처리
  • 메시지를 일정 기간(로그) 보관·재처리
  • 실시간 스트리밍 파이프라인 구축
  • 마이크로서비스 간 이벤트 버스
  • CDC(Change Data Capture) 통합

🔴 다른 솔루션이 나을 수 있는 경우

  • 단순한 작업 큐 → RabbitMQ / SQS
  • 요청-응답(RPC) 패턴 → gRPC / REST
  • 메시지 수가 적고 운영 단순성 필요
  • 메시지별 우선순위 큐잉이 필요한 경우
  • 소규모 팀·서비스 (운영 비용 과다)
Kafka 생태계

🔗 Kafka Connect

외부 시스템(DB, S3, Elasticsearch 등)과 Kafka를 연결하는 프레임워크. Source/Sink 커넥터를 플러그인으로 배포. 별도 코드 없이 파이프라인 구성 가능.

🌊 Kafka Streams

Kafka 위에서 동작하는 클라이언트 스트림 처리 라이브러리. 별도 클러스터 없이 Java 앱으로 실행. stateful 처리, 윈도잉, 조인 지원.

ksqlDB

Kafka 스트림을 SQL로 처리하는 데이터베이스. 실시간 집계·필터·조인을 SQL 구문으로 선언. Kafka Streams 위에 구축.

📊 Schema Registry

Avro/Protobuf/JSON 스키마를 중앙 관리. Producer-Consumer 간 스키마 호환성 검증. Confluent 플랫폼 구성요소이나 오픈소스 버전 존재.