Apache Kafka는 실시간 데이터 파이프라인과 스트리밍 애플리케이션을 구축하기 위해 설계된 분산 이벤트 스트리밍 플랫폼이다. 원래 링크드인(LinkedIn)에서 개발되었으며, 2011년에 오픈소스로 공개된 후 아파치 소프트웨어 재단(Apache Software Foundation)의 최상위 프로젝트가 되었다. Kafka는 데이터를 토픽으로 구성하여 여러 브로커(서버)에 파티션과 복제본으로 분산 저장함으로써 높은 처리량과 내결함성을 갖춘 메시징을 제공한다. 로그 집계, 메트릭 수집, 이벤트 소싱, 스트림 처리에 널리 사용되며, Kafka Streams와 ksqlDB를 포함한 강력한 생태계를 갖추고 있다.
Kafka의 핵심 추상화는 이벤트(레코드 또는 메시지라고도 함)로, 시스템에서 발생한 사실을 나타낸다. 프로듀서는 이벤트를 토픽에 게시하고, 컨슈머는 해당 토픽을 구독하여 이벤트를 읽는다. 각 토픽은 파티션으로 분할되며, 이를 통해 병렬 처리와 파티션 내 순서 보장이 가능하다. 이벤트는 로그에 추가되고 구성 가능한 기간 동안 보존되므로 재생(replay)이 가능하고 여러 컨슈머 그룹이 동일한 데이터를 독립적으로 읽을 수 있다. 이러한 설계는 Kafka를 기존 메시지 큐와 차별화하여 메시징과 저장 기능을 동시에 제공한다.
아키텍처 및 주요 구성 요소
Kafka의 아키텍처는 브로커, 토픽, 파티션, 프로듀서, 컨슈머, 컨슈머 그룹 등 여러 핵심 구성 요소로 이루어진다. Kafka 클러스터는 각각 파티션을 저장하고 읽기/쓰기 요청을 처리하는 브로커들의 집합이다. 컨트롤러 브로커는 파티션 리더와 복제본 할당을 관리한다. 프로듀서는 키 기반 해싱 또는 라운드로빈 방식으로 각 이벤트의 파티션을 선택하며, 다양한 내구성 수준으로 쓰기를 확인할 수 있다. 컨슈머는 파티션에서 이벤트를 가져오며, 컨슈머 그룹은 각 파티션이 그룹 내 하나의 컨슈머에 할당되는 부하 분산을 제공한다. 컨슈머에 장애가 발생하면 파티션은 다른 그룹 구성원에게 재할당된다.
복제는 Kafka 내결함성의 핵심이다. 각 파티션에는 리더와 여러 팔로워(복제본)가 있다. 쓰기는 리더로 전달되고 팔로워가 데이터를 복제한다. 리더에 장애가 발생하면 팔로워가 새로운 리더가 된다. 복제 팩터는 존재하는 복사본 수를 결정하며, 프로덕션 환경에서는 일반적으로 3이다. Kafka는 또한 클러스터 메타데이터 관리(브로커 등록 및 토픽 구성 포함)를 위해 ZooKeeper(또는 최신 버전의 KRaft 모드)를 사용한다.
이벤트 스트리밍 및 처리
Kafka는 단순한 메시지 브로커가 아니라 이벤트 스트리밍 플랫폼이다. 상태 저장 및 상태 비저장 처리 애플리케이션을 구축하기 위한 Java 라이브러리인 Kafka Streams를 통해 스트림 처리를 지원한다. Kafka Streams는 필터링, 집계, 조인, 윈도잉과 같은 작업을 정확히 한 번(exactly-once) 의미론으로 수행할 수 있게 한다. SQL과 유사한 인터페이스인 ksqlDB는 Java 코드를 작성하지 않고도 대화형 쿼리와 스트림 처리를 가능하게 한다. 이러한 도구는 Kafka가 실시간 데이터를 추론 및 훈련을 위한 모델에 공급하는 인공지능 및 머신러닝 파이프라인과 통합된다.
Kafka의 로그 기반 저장은 시스템 상태가 일련의 이벤트에서 파생되는 이벤트 소싱을 가능하게 한다. 이 패턴은 감사 가능성과 재생 가능성을 제공하므로 금융 서비스 및 전자상거래에서 널리 사용된다. 또한 컨슈머가 읽기 속도를 제어하고 프로듀서가 효율성을 위해 이벤트를 일괄 처리할 수 있으므로 백프레셔(backpressure)를 자연스럽게 처리한다.
사용 사례 및 생태계
Kafka는 다양한 산업 분야에서 실시간 사용 사례로 사용된다. 전자상거래에서는 개인화 및 추천 시스템을 위해 사용자 활동을 추적한다. 금융에서는 거래를 처리하고 사기를 탐지한다. 통신에서는 통화 상세 기록을 집계한다. 주요 클라우드 제공업체는 아마존 웹 서비스(Amazon MSK), 애저(Azure Event Hubs for Kafka), 구글 클라우드(Confluent Cloud on Google Cloud)를 포함한 관리형 Kafka 서비스를 제공한다. 이러한 서비스는 운영 오버헤드를 줄이고 다른 클라우드 네이티브 도구와 통합된다.
Kafka 생태계에는 데이터베이스, 데이터 레이크 및 기타 시스템과 통합하기 위한 커넥터가 포함된다. Kafka Connect는 소스 및 싱크 커넥터를 제공하여 PostgreSQL, MongoDB, S3와 같은 시스템에서 데이터를 수집할 수 있게 한다. Schema Registry는 데이터 호환성을 위해 Avro, JSON 또는 Protobuf 스키마를 관리한다. MirrorMaker와 같은 도구는 재해 복구를 위해 클러스터 간에 데이터를 복제한다. 이러한 생태계는 Kafka를 데이터 인프라의 중추로 만들며, 대규모 처리를 위해 아파치 스파크 또는 Flink와 함께 사용되는 경우가 많다.
성능 및 확장성
Kafka는 순차 디스크 I/O와 제로카피(zero-copy) 데이터 전송을 통해 높은 처리량을 달성한다. 쓰기와 읽기를 일괄 처리하여 네트워크 오버헤드를 줄인다. 파티셔닝은 수평 확장을 가능하게 한다. 브로커를 추가하면 저장 용량과 처리량이 증가한다. Kafka는 대규모 클러스터에서 초당 수백만 개의 이벤트를 처리할 수 있으며, 지연 시간은 수 밀리초에 불과하다. 그러나 성능은 배치 크기, 압축, 확인(acknowledgment) 설정과 같은 구성에 따라 달라진다. 이러한 매개변수 튜닝은 프로덕션 배포에 중요하다.
확장성에는 파티션 수와 복제 관리도 포함된다. 파티션이 너무 많으면 메타데이터 오버헤드가 증가하고, 너무 적으면 병렬성이 제한된다. Kafka의 설계는 동적 확장을 지원하지만, 브로커 간 파티션 리밸런싱은 일시적인 사용 불가를 초래할 수 있다. 최신 버전은 증분 협력 리밸런싱(incremental cooperative rebalancing)을 사용하여 중단을 최소화한다.
다른 시스템과의 비교
Kafka는 종종 RabbitMQ 및 ActiveMQ와 같은 기존 메시지 브로커와 비교된다. 이러한 시스템과 달리 Kafka는 구성 가능한 기간 동안 이벤트를 보존하여 재생과 다중 컨슈머 접근을 가능하게 한다. RabbitMQ는 라우팅이 더 유연하고 복잡한 메시징 패턴을 지원하지만, Kafka는 처리량과 내구성에서 우수하다. 스트림 처리 측면에서 Kafka는 Pulsar 및 Redpanda와 같은 시스템과 경쟁하며, 이들은 서로 다른 트레이드오프로 유사한 기능을 제공한다. Pulsar는 저장 계층과 서빙 계층을 분리하고, Redpanda는 Kafka와 API 호환되지만 더 낮은 지연 시간을 위해 C++로 작성되었다.
데이터 아키텍처에서 Kafka의 역할은 단순한 메시징 시스템에서 중앙 이벤트 백본으로 진화했다. 실시간 데이터 피드가 필수적인 딥러닝 프레임워크 및 신경망 훈련 파이프라인과 통합된다. 2025년 현재 Kafka는 여전히 지배적인 표준으로, KRaft 모드(ZooKeeper 제거), 계층형 저장(tiered storage), 향상된 관찰 가능성에 초점을 맞춘 지속적인 개발이 진행 중이다.
결론
Apache Kafka는 현대 데이터 중심 애플리케이션의 기반 기술로, 안정적이고 확장 가능하며 실시간 이벤트 스트리밍을 가능하게 한다. 분산 로그 아키텍처와 풍부한 생태계는 마이크로서비스 통신부터 복잡한 스트림 처리까지 다양한 사용 사례를 지원한다. 신중한 운영 관리가 필요하지만, 처리량, 내구성, 유연성 측면의 이점은 기업과 클라우드 제공업체 모두에게 선호되는 선택이 되게 한다. Kafka의 지속적인 진화는 스트리밍 데이터가 반응적이고 지능적인 시스템에 중요한 생성형 AI 및 대규모 언어 모델 애플리케이션 시대에도 그 관련성을 보장한다.