다룬다
서비스 간 직접 연동이 아픈 이유와 로그를 놓는 목적. 토픽 · 파티션 · 오프셋 — 로그라는 자료구조. 복제 · ISR · KRaft — 클러스터가 장애를 견디는 법. 프로듀서 · 컨슈머의 핵심 설정과 전달 보장(유실 · 중복 · 순서). 토픽 설계 — 파티션 수 · 보존 · 컴팩션. Connect · 스키마 레지스트리 — 언제 무엇을 더 얹는가. 온프렘 k8s 배포(Strimzi · 스토리지 · 리스너)와 운영 · 트러블슈팅.
Kafka는 한번 놓으면 서비스 전체의 신경망이 된다 — 도입 전에 성질을 알아야 하는 이유다
이벤트 스트리밍Event Streaming브로커BrokerKRaftKafka RaftStrimzi온프렘On-premises전제하는 것: 쿠버네티스 기본기(StatefulSet·Service·PV·오퍼레이터 개념), 터미널. 전제하지 않는 것: 메시지 큐 경험, Kafka 사용 경험, 특정 언어의 클라이언트 API.
다룬다
서비스 간 직접 연동이 아픈 이유와 로그를 놓는 목적. 토픽 · 파티션 · 오프셋 — 로그라는 자료구조. 복제 · ISR · KRaft — 클러스터가 장애를 견디는 법. 프로듀서 · 컨슈머의 핵심 설정과 전달 보장(유실 · 중복 · 순서). 토픽 설계 — 파티션 수 · 보존 · 컴팩션. Connect · 스키마 레지스트리 — 언제 무엇을 더 얹는가. 온프렘 k8s 배포(Strimzi · 스토리지 · 리스너)와 운영 · 트러블슈팅.
다루지 않는다
언어별 클라이언트 API 상세 (개념과 설정 이름까지만). Kafka Streams · Flink 상세 (존재와 용도만). ksqlDB. 멀티 데이터센터 재해 복구 설계 (MirrorMaker 2는 이름만). OS · JVM 수준 성능 튜닝. Redpanda · Pulsar 상세 비교 (자리만 잡아 준다). 쿠버네티스 기초 (→ CKA 덱).
전통적 메시지 큐는 메시지를 꺼내면 지운다. Kafka는 추가만 되는(append-only) 로그에 쌓아 두고 정해진 보존 기간 동안 지우지 않는다. 소비자는 로그의 어디까지 읽었는지(오프셋)만 움직인다 — 그래서 같은 데이터를 여러 팀이 각자 읽을 수 있고, 어제 데이터를 다시 읽을 수도 있다.
토픽은 병렬 처리를 위해 여러 파티션으로 쪼개지고, 순서 보장은 파티션 하나 안에서만 성립한다. “전체 순서”는 없다 — 순서가 필요한 단위(예: 같은 주문 ID)를 같은 키로 묶어 같은 파티션에 보내는 것이 Kafka에서 순서를 다루는 유일한 방법이다 (4장).
브로커는 밀어주지(push) 않는다 — 컨슈머가 당겨(pull) 가고, 어디까지 읽었는지도 컨슈머 쪽 책임이다. 그래서 유실·중복·순서 같은 보장의 상당 부분이 브로커 설정이 아니라 클라이언트 설정과 애플리케이션 코드에서 결정된다. “Kafka를 쓰면 자동으로 안전하다”가 아니라 어느 쪽 나사인지 아는 것이 이 덱의 목표다 (6장).
2026년 8월 기준이다. Kafka는 2024~2025년에 아키텍처가 크게 바뀌었는데(ZooKeeper 제거), 검색 결과에는 그 이전 글이 훨씬 많이 남아 있다 — 시점 확인이 특히 중요하다.
| 항목 | 지금 | 낡은 정보 (검색 결과에 많이 남아 있음) |
|---|---|---|
| Kafka | 4.3 (2026-05) — KRaft 전용 | ZooKeeper 전제 글 (3.x 이하). ZooKeeper는 4.0(2025-03)에서 제거됐다 |
| CLI | kafka-topics.sh --bootstrap-server … | --zookeeper 옵션 (3.0에서 제거) |
| 프로듀서 기본값 | acks=all · 멱등성 기본 켜짐 (3.0부터) | “기본은 acks=1이라 유실될 수 있다”는 글 |
| 컨슈머 그룹 | 새 리밸런스 프로토콜 KIP-848 (4.0에서 GA) — 브로커 주도, 멈춤 최소화 | “리밸런스 = 그룹 전체 정지” 전제의 글 |
| Strimzi | 0.51 — KRaft + KafkaNodePool이 기본 | spec.zookeeper가 들어간 예시 YAML |