이 시리즈를 처음 시작할 때만 해도 Kafka는 거대한 생태계를 가진 복잡한 분산 메시징 시스템처럼 보였다.

하지만 지금까지 차근차근 따라오면서 브로커 내부의 저장 파일 구조부터, 프로듀서의 배치 처리, 컨슈머 그룹의 리밸런싱, 하드웨어 관점의 최적화 방식, Exactly-Once에 이르기까지 하나의 큰 축으로 이어지는 흐름을 발견했다.

Kafka를 이해하는 핵심은 개별 기능보다 이 기능들이 어떻게 연결되어 하나의 시스템 철학을 이루는가에 있다.

Kafka 사고방식 하나. 흐름을 끊지 않는다

Kafka는 처음부터 데이터가 무조건 앞으로 흘러가야 한다는 점을 기준으로 설계되었다.

프로듀서는 일단 기록하고, 브로커는 Append-Only 로그로 받아 적고, 컨슈머는 자신만의 offset을 들고 순서대로 읽어간다.

중간에서 데이터가 되돌아가거나 재정렬되는 일이 없다.

흐름을 끊지 않는다는 이 원칙이 설계 전반을 지배한다.

로그 단위 운영, 세그먼트 구조, Page Cache 이용 방식, Zero-Copy, 컨슈머의 lag 등 모든 컴포넌트가 같은 사고방식 위에 서 있다.

Kafka가 빠르고 단순하며 고성능인 이유는 바로 이 흐름의 일관성 때문이다.

Kafka 사고방식 둘. 복잡성의 축은 ‘시간’ 하나뿐이다

분산 시스템에서 가장 어려운 것은 여러 노드 사이의 상태를 동일하게 맞추는 일이다.

Kafka는 상태를 복잡하게 나누지 않았다.

그 대신 로그라는 시간을 기준으로 한 단일 구조 안에 모든 상태를 기록하게 만들었다.

로그가 시간 축을 제공한다.

Offset은 이 시간 축의 위치 좌표다.

Replicate는 이 시간 축을 그대로 복사하는 일이다.

Rebalance는 어느 컨슈머가 어느 시간 축을 이어서 읽을지 재조정하는 과정이다.

Kafka의 동작 대부분은 결국 시간 축에서 바라보면 단순해진다.

Kafka 사고방식 셋. 일단 기록하고, 나중에 처리한다