Kafka는 분산 이벤트 스트리밍 플랫폼이다.
대부분의 실시간 서비스가 Kafka를 채택하는 이유는 단순히 빠르기 때문만이 아니라, 속도와 안정성이라는 서로 충돌하는 두 요구사항을 동시에 만족한다는 점 때문이다.
카프카를 처음 접했을 때 가장 놀랐던 점은
“이 정도 속도로 흘러가는데, 복제 기반 고가용성까지 챙긴다고?”
라는 의문이었고, 실제로 Kafka는 아래와 같은 구조적 특성 덕분에 이를 달성한다.
1. Random I/O 제거 (append-only 로그 구조)
Kafka는 파티션을 append-only log 로 저장한다.
즉, 항상 파일 끝(offset의 마지막)에 순차적으로 쓰기 때문에:
- 디스크 seek이 거의 발생하지 않고
- 디스크의 최대 sequential write 성능을 그대로 끌어다 쓸 수 있다
- HDD/SSD 가리지 않고 높은 throughput이 난다
쓰기뿐 아니라 읽기도 page cache hit이 극대화되어 빠르다.
2. 네트워크 병목 최소화 (zero-copy + page cache)
일반적인 애플리케이션은
디스크 → 커널 → 유저 공간 → 커널(socket) → 네트워크
이런 복잡한 경로로 데이터를 이동시키지만,
Kafka는 Linux의 page cache 와 sendfile(=zero-copy) 를 적극 활용한다.
- 디스크 파일을 읽어도 실제로는 page cache(RAM)에서 처리되고
- 데이터가 유저 공간을 거치지 않고
- NIC가 DMA로 직접 가져가도록 한다
즉, 디스크·CPU·네트워크 병목을 동시에 제거하는 구조다.
(RAM이 부족하면 page cache가 줄어들어 성능만 조금 떨어진다)
3. 파티션 단위 리더 구조
파티션 단위로 leader/follower가 존재하며,
leader는 파티션 단위로 고르게 분산된다.
이 덕분에:
- 파티션만 늘리면 그대로 수평 확장된다
- 컨슈머도 파티션 개수에 따라 처리량이 선형 증가한다
- 운영적으로도 브로커/컨슈머 부하를 쉽게 조절할 수 있다
리소스만 받쳐주면 확장은 매우 간단하다.
4. Pull 기반 Consumer (Backpressure 분리)
기존 MQ들은 push 모델이라
컨슈머가 느려지면 브로커가 밀려 전체 파이프라인이 병목에 걸렸지만,
Kafka는 pull 모델이다.
- Consumer가 스스로 속도에 맞춰 가져감
- Broker는 단순 저장소 역할
- Retention 기간 동안 원본 데이터 유지
덕분에 컨슈머 속도 저하가 브로커 안정성에 전파되지 않는다.
5. Replication도 Pull 기반 (ISR 유지)
Kafka의 follower는 leader가 push하는 것이 아니라
스스로 leader의 로그를 pull해간다.
- ISR(In-Sync Replicas)을 유지하여 follower가 최신 offset에 거의 근접
- leader 장애 시 follower가 빠르게 리더로 승격
- 복제 오버헤드도 leader 스레드를 막지 않음
즉, 고가용성을 유지하면서도 leader의 write 성능이 저하되지 않는 구조다.
6. Batch 기반 Produce/Consume
Kafka는 메시지를 하나씩 처리하지 않는다.
Producer와 Consumer 모두 batch 단위로 데이터를 주고받는다.
- 네트워크 왕복 횟수 감소
- 압축 효율 증가
- consumer가 데이터 특성에 맞춰 batch size 조절
- 불필요한 소/대 메시지 혼합 문제 완화
대형 메시지(수십 MB)는 Kafka 기본 설계에 맞지 않기 때문에
작은 메시지 다량 전송이 이상적인 구조다.
Kafka가 완벽한 시스템은 아니다. 하지만 기업들이 이 기술을 꾸준히 선택하는 데에는 분명한 이유가 있다.
일반적으로 서로 충돌하는 두 특성(속도와 안정성)을 동시에 달성하기 위해, 데이터 파이프라인의 모든 단계를 뜯어보고 최적화한 구조적 설계가 놀랍다.
'ETL 관련' 카테고리의 다른 글
| View 또는 Click Metric에 대한 여러 관점 (5) | 2025.07.14 |
|---|---|
| 실무에서 자주 만나는 multi dimension 데이터 결합과 dataset 가이드 (0) | 2025.06.13 |
| Druid Spec 관련 정리 (0) | 2025.05.30 |
| Kafka Consumer입장 사용 경험 정리 (0) | 2025.05.07 |
| 데이터 파이프라인에서 최적화라는 함정 (0) | 2025.03.05 |