문서의 각 단락이 어느 리비전에서 마지막으로 수정되었는지 확인할 수 있습니다. 왼쪽의 정보 칩을 통해 작성자와 수정 시점을 파악하세요.

Kafka | |
개발자 | |
최초 출시일 | 2011년 |
최신 안정판 | 3.8.0 (2024년 7월) |
프로그래밍 언어 | |
분류 | |
라이선스 | Apache 라이선스 2.0 |
공식 웹사이트 | https://kafka.apache.org |
기술 상세 정보 | |
설계 목표 | 고처리량, 낮은 지연 시간, 확장성, 내결함성 |
핵심 개념 | |
데이터 보존 | 설정 가능한 기간 또는 크기 기반 |
주요 사용 사례 | 실시간 데이터 파이프라인, 스트리밍 애플리케이션, 이벤트 소싱, 로그 집계 |
통합 생태계 | Apache Spark, Apache Flink, Elasticsearch, 다양한 커넥터 |
관리 도구 | Kafka CLI, Kafka Manager, Confluent Control Center |
클라우드 서비스 | |

Apache Kafka는 링크드인에서 개발된 오픈 소스 분산 스트리밍 플랫폼이다. 실시간으로 대량의 데이터 스트림을 게시(publish), 구독(subscribe), 저장(store), 처리(process)할 수 있도록 설계되었다. 초기에는 활동 추적 데이터 파이프라인을 처리하기 위해 만들어졌으나, 이후 실시간 스트리밍 데이터를 다루는 다양한 애플리케이션의 핵심 인프라로 널리 채택되었다.
Kafka는 높은 처리량, 낮은 지연 시간, 그리고 수평적 확장성을 핵심 가치로 한다. 이는 분산 시스템의 원칙에 기반하여, 여러 서버(브로커)에 걸쳐 데이터를 분산 저장하고 처리함으로써 달성된다. 데이터는 지속적이고 순서가 있는 레코드 스트림으로 구성되며, 이러한 스트림은 토픽이라는 카테고리로 구분된다.
기존의 메시지 큐 시스템과 비교했을 때, Kafka는 메시지를 소비(consume)한 후에도 삭제하지 않고 일정 기간 동안 디스크에 보존한다는 점이 특징이다. 이는 데이터의 재생(replay)과 여러 컨슈머 그룹이 독립적으로 동일한 데이터를 처리할 수 있게 하는 토대를 제공한다.
특징 | 설명 |
|---|---|
분산형 아키텍처 | 여러 브로커로 구성된 클러스터에서 실행되어 내결함성과 확장성을 보장한다. |
높은 처리량 | 초당 수백만 개의 메시지를 처리할 수 있다. |
낮은 지연 시간 | 밀리초 단위의 지연 시간으로 메시지를 전달한다. |
데이터 내구성 | 수신된 데이터를 디스크에 안정적으로 저장하여 손실을 방지한다. |
확장성 | 시스템 운영 중단 없이 브로커를 추가하여 용량과 처리량을 늘릴 수 있다. |
주요 사용 사례로는 실시간 분석, 이벤트 소싱, 마이크로서비스 간 통합, 로그 및 메트릭 집계, 데이터 파이프라인 구축 등이 있다. Kafka는 Java와 Scala로 작성되었으며, Apache Software Foundation의 최상위 프로젝트로 관리되고 있다.

Apache Kafka는 분산 스트리밍 플랫폼으로, 이벤트를 토픽이라는 논리적 카테고리로 구성하여 처리한다. 각 토픽은 하나 이상의 파티션으로 분할되며, 이는 데이터를 병렬로 처리하고 확장성을 높이는 기본 단위이다. 파티션 내의 각 메시지는 순서가 보장되는 고유한 오프셋 번호를 부여받는다. 이 오프셋은 컨슈머가 자신의 읽기 위치를 추적하는 데 사용된다.
데이터를 생산하는 프로듀서는 메시지를 특정 토픽의 파티션에 게시한다. 프로듀서는 라운드 로빈 방식으로 또는 메시지 키를 기반으로 파티션을 선택할 수 있다. 반면, 컨슈머는 하나 이상의 토픽을 구독하여 메시지를 읽고 처리한다. 컨슈머들은 컨슈머 그룹을 형성하여 파티션을 나누어 소비함으로써 수평적 확장과 장애 허용이 가능해진다.
Kafka 클러스터는 여러 대의 브로커 서버로 구성된다. 각 브로커는 특정 토픽 파티션의 리더 역할을 포함하여 여러 파티션을 호스팅한다. 클라이언트는 클러스터 내 아무 브로커에나 연결하여 전체 메타데이터를 얻고, 실제 데이터 생산 및 소비는 해당 파티션의 리더 브로커와 직접 통신하여 이루어진다.
데이터의 안정성과 가용성을 보장하기 위해 Kafka는 리플리케이션 메커니즘을 사용한다. 각 파티션의 데이터는 복제 팩터에 설정된 수만큼 여러 브로커에 복제된다. 이 복제본들 중 하나가 리더가 되고, 나머지는 팔로워가 된다. 리더에 문제가 발생하면 팔로워 중 하나가 새로운 리더로 승격된다. 리더와 동기화 상태를 유지하는 팔로워들의 집합을 ISR(In-Sync Replicas)이라고 한다.
토픽은 카프카에서 데이터 스트림을 구분하는 논리적 단위이다. 특정 유형의 메시지나 이벤트를 그룹화하는 카테고리나 피드 이름으로 생각할 수 있다. 예를 들어, '사용자_클릭'이나 '주문_트랜잭션'과 같은 이름을 가질 수 있다. 프로듀서는 특정 토픽에 메시지를 발행하고, 컨슈머는 관심 있는 토픽을 구독하여 메시지를 읽는다.
토픽은 하나 이상의 파티션으로 나뉜다. 파티션은 토픽을 병렬 처리하고 확장성을 제공하기 위한 물리적 단위이다. 각 파티션은 순서가 보장되는 불변의 레코드 시퀀스이며, 새로운 레코드는 파티션의 끝에만 추가된다. 파티션 내 각 레코드는 오프셋이라는 고유한 순차 ID로 식별된다. 오프셋은 파티션 내에서만 의미가 있으며, 전역적으로 고유하지는 않다.
개념 | 설명 | 특징 |
|---|---|---|
토픽 | 관련 메시지의 논리적 그룹 | 애플리케이션별로 생성되며, 다수의 파티션을 가질 수 있다. |
파티션 | 토픽을 분할한 물리적 단위 | 병렬 처리와 성능 확장의 기초가 된다. 순서가 보장된다. |
오프셋 | 파티션 내 레코드의 고유 식별자 | 0부터 시작하는 단순 증가 정수이다. 컨슈머가 읽은 위치를 추적하는 데 사용된다. |
파티션은 카프카 클러스터 내의 여러 브로커에 분산되어 저장된다. 이를 통해 단일 브로커의 성능 한계를 넘어 처리량과 저장 용량을 확장할 수 있다. 컨슈머 그룹은 여러 파티션에 걸쳐 메시지를 병렬로 소비할 수 있으며, 각 컨슈머는 일반적으로 하나 이상의 파티션을 전담하여 메시지를 읽는다.
프로듀서는 Kafka 클러스터에 데이터를 발행하는 클라이언트 애플리케이션이다. 프로듀서는 메시지를 특정 토픽으로 전송하며, 라운드 로빈 방식이나 메시지 키를 기반으로 한 해싱 방식 등을 사용하여 메시지를 파티션에 할당한다. 메시지 키를 지정하면 동일한 키를 가진 메시지는 항상 같은 파티션에 기록되어 순서가 보장된다. 프로듀서는 배치 전송, 압축, 재시도 메커니즘을 통해 높은 처리량과 신뢰성을 제공한다.
컨슈머는 토픽에서 데이터를 읽어 처리하는 클라이언트 애플리케이션이다. 컨슈머는 하나 이상의 컨슈머로 구성된 컨슈머 그룹의 일부로 동작하며, 그룹 내에서 파티션은 각 컨슈머에게 분배된다. 이를 통해 메시지 처리의 병렬성과 확장성을 달성한다. 컨슈머는 자신이 읽은 위치인 오프셋을 커밋하여 관리하며, 장애 발생 시 이 오프셋을 기반으로 복구할 수 있다.
프로듀서와 컨슈머는 완전히 분리되어 있으며, 서로를 알 필요 없이 토픽을 통해 데이터를 주고받는다. 이는 느슨한 결합을 가능하게 하는 Kafka의 핵심 설계 원칙이다. 컨슈머는 자신의 처리 속도에 맞춰 데이터를 풀(pull) 방식으로 가져오며, 이는 프로듀서의 속도에 영향을 받지 않고 배치 처리 등을 최적화할 수 있는 장점을 제공한다.
구성 요소 | 역할 | 주요 특징 |
|---|---|---|
프로듀서 | 데이터 발행(생산) | 메시지 키 기반 파티션 지정, 배치 전송, 재시도 |
컨슈머 | 데이터 구독(소비) | 컨슈머 그룹 내 파티션 할당, 오프셋 커밋을 통한 상태 관리 |
브로커는 아파치 카프카 시스템의 기본 실행 프로세스이자 서버 노드입니다. 각 브로커는 하나 이상의 토픽을 호스팅하며, 토픽 내 파티션의 리더 또는 팔로워 역할을 담당합니다. 브로커의 주요 역할은 프로듀서로부터 데이터를 수신하여 디스크에 저장하고, 컨슈머의 데이터 요청에 응답하여 메시지를 전달하는 것입니다. 또한 브로커는 다른 브로커들과 지속적으로 통신하여 클러스터 상태를 동기화하고, 리플리케이션과 ISR 메커니즘을 통해 내결함성을 유지합니다.
여러 대의 브로커가 모여 하나의 카프카 클러스터를 형성합니다. 클러스터는 시스템의 확장성과 가용성을 보장하는 핵심 단위입니다. 클러스터 내에는 모든 브로커의 메타데이터를 관리하고 파티션 리더 선출을 조정하는 특별한 브로커인 주키퍼 앙상블[1] 또는 컨트롤러가 존재합니다. 클라이언트(프로듀서/컨슈머)는 클러스터에 연결하여 특정 브로커와 직접 통신하며, 클러스터는 클라이언트에게 투명하게 작동합니다.
클러스터의 구성과 성능은 브로커의 수와 배치에 따라 결정됩니다. 일반적인 구성 요소는 다음과 같습니다.
구성 요소 | 역할 |
|---|---|
브로커 ID | 클러스터 내 각 브로커를 식별하는 고유 번호 |
리스너 | 클라이언트 연결을 수신하는 네트워크 엔드포인트 |
로그 디렉토리 | 메시지 데이터가 실제로 저장되는 디스크 경로 |
컨트롤러 | 클러스터 메타데이터 관리 및 조정을 담당하는 브로커 |
클러스터를 운영할 때는 브로커 간의 네트워크 지연 시간을 최소화하고, 디스크 I/O 성능을 고려하여 브로커를 배치해야 합니다. 또한, 클러스터의 규모는 처리해야 할 데이터의 양과 가용성 요구사항에 따라 결정됩니다.
리플리케이션은 카프카가 제공하는 핵심적인 내결함성 메커니즘이다. 각 파티션의 데이터는 복제본을 생성하여 여러 브로커에 분산 저장함으로써, 단일 브로커 장애 시에도 데이터 유실과 서비스 중단을 방지한다. 복제본 중 하나는 리더로 선출되어 모든 읽기/쓰기 요청을 처리하며, 나머지는 팔로워로서 리더의 데이터를 비동기적으로 복제한다. 이 구조는 고가용성을 보장하면서도 일관된 읽기 지점을 제공한다.
리더와 팔로워의 상태를 관리하는 핵심 개념이 ISR(In-Sync Replica)이다. ISR은 리더와 동기화 상태를 유지하는 팔로워들의 집합을 의미한다. 팔로워는 주기적으로 리더에게 페치 요청을 보내 데이터를 복제하며, 리더는 이들의 상태를 추적한다. 설정된 임계값 내에서 리더를 따라잡지 못하거나 통신이 단절된 팔로워는 ISR에서 제외된다. ISR 내의 복제본만이 새로운 리더로 선출될 자격을 가진다.
리더 선출은 주로 브로커 장애 시 발생한다. 리더 브로커가 다운되면, 컨트롤러 역할을 하는 브로커가 ISR 목록에서 새로운 리더를 선출한다. 이때 ISR 내의 복제본만 후보가 되므로, 데이터 일관성이 보장된다. 리플리케이션 팩터는 일반적으로 3으로 설정하여 하나의 브로커 장애를 허용하는 구성이 일반적이다. 리플리케이션과 ISR 메커니즘은 카프카가 확장 가능하면서도 안정적인 분산 시스템으로 동작할 수 있는 기반을 제공한다.

Apache Kafka는 분산 스트리밍 플랫폼으로서, 대규모 실시간 데이터 처리를 위한 몇 가지 핵심 기능과 특징을 제공한다. 가장 두드러진 특징은 높은 처리량과 낮은 지연 시간을 동시에 달성하는 고성능 스트리밍 능력이다. 이는 순차적인 디스크 I/O, 효율적인 배치 처리, 그리고 제로 카피 메커니즘과 같은 설계 선택 덕분에 가능해졌다. 프로듀서는 데이터를 큰 배치로 전송할 수 있으며, 컨슈머는 풀 모델을 통해 필요할 때마다 데이터를 가져온다.
확장성과 내결함성은 카프카의 근본적인 설계 원칙이다. 수평적 확장이 용이하도록 설계되어, 트래픽 증가에 따라 브로커를 클러스터에 쉽게 추가할 수 있다. 내결함성은 리플리케이션 메커니즘을 통해 보장된다. 각 파티션의 데이터는 여러 브로커에 복제되어 저장되며, 리더 브로커에 장애가 발생하더라도 복제본 중 하나가 새로운 리더로 선출되어 서비스가 중단되지 않는다. 이 복제본들의 동기화 상태는 ISR 목록으로 관리된다.
데이터 보존 정책은 카프카를 기존 메시징 큐와 구분하는 중요한 특징이다. 카프카는 데이터를 일정 기간 또는 크기 기준으로 디스크에 보존한다. 이는 컨슈머가 실시간으로 데이터를 소비하지 않아도 나중에 다시 읽을 수 있음을 의미하며, 데이터 재처리나 새로운 애플리케이션을 위한 역사적 데이터 활용을 가능하게 한다. 보존 정책은 토픽별로 설정할 수 있다.
특징 | 설명 | 주요 이점 |
|---|---|---|
고성능 스트리밍 | 높은 처리량과 낮은 지연 시간의 실시간 데이터 처리 | 대규모 이벤트 스트림 처리에 적합 |
확장성 | 트래픽에 따라 브로커를 추가하는 수평적 확장 용이 | 시스템 성장에 유연하게 대응 |
내결함성 | 리플리케이션과 ISR을 통한 장애 복구 | 데이터 유실 없이 고가용성 제공 |
데이터 보존 | 설정 가능한 기간/크기 기준 디스크 보존 | 컨슈머 독립성과 데이터 재처리 지원 |
Apache Kafka의 고성능 스트리밍 능력은 단일 브로커가 초당 수십만 건의 메시지를 처리하고, 클러스터 수준에서는 초당 수백만 건의 메시지 처리도 가능하도록 설계되었다. 이 성능은 디스크에 대한 순차적 읽기/쓰기 방식, 제로 카피 기술의 활용, 그리고 효율적인 배치 처리에 기반한다. 특히 메시지를 디스크에 저장하지만, 운영체제의 페이지 캐시를 적극 활용하여 메모리 접근 속도에 가까운 성능을 제공한다.
성능을 결정하는 핵심 요소는 다음과 같다.
요소 | 설명 | 성능 영향 |
|---|---|---|
파티션 수 | 토픽을 구성하는 병렬 처리 단위. | 파티션 수가 증가하면 프로듀서와 컨슈머의 병렬 처리량이 선형적으로 증가한다. |
배치 처리 크기 | 프로듀서가 한 번에 전송하는 메시지 묶음의 크기. | 배치 크기가 클수록 네트워크 오버헤드가 줄고 처리량이 증가하지만, 지연 시간은 증가할 수 있다. |
리플리케이션 팩터 | 데이터의 복제본 수. | 내결함성을 보장하지만, 쓰기 성능에는 오버헤드가 발생한다. |
하드웨어(디스크, 네트워크) | 브로커가 사용하는 물리적 자원. | 빠른 SSD와 고대역폭 네트워크는 처리량과 지연 시간에 직접적인 영향을 미친다. |
이러한 설계 덕분에 Kafka는 기존의 메시지 큐 시스템보다 훨씬 높은 처리량을 제공하면서도, 디스크 기반의 영속성을 보장한다. 이는 실시간 로그 집계나 대규모 이벤트 소싱과 같이 높은 처리량과 데이터 안정성이 모두 요구되는 시나리오에서 결정적인 장점으로 작용한다.
Apache Kafka는 수평적 확장성과 높은 내결함성을 핵심 설계 원칙으로 삼는다. 확장성은 브로커라고 불리는 서버를 클러스터에 쉽게 추가함으로써 달성된다. 데이터는 토픽 단위로 분할되어 여러 브로커에 걸쳐 분산 저장되므로, 시스템의 처리 용량과 저장 용량을 선형적으로 증가시킬 수 있다. 이는 트래픽이 급증하는 상황에서도 추가 하드웨어 투입을 통해 대응할 수 있음을 의미한다.
내결함성은 리플리케이션 메커니즘을 통해 보장된다. 각 파티션의 데이터는 복제본을 여러 브로커에 분산 저장한다. 리더 파티션이 장애를 일으키면, ISR(In-Sync Replica) 목록에 있는 팔로워 파티션 중 하나가 새로운 리더로 자동 선출된다. 이 과정은 클라이언트에게 거의 투명하게 이루어지며, 데이터 유실 없이 서비스를 지속할 수 있다.
특성 | 구현 방식 | 효과 |
|---|---|---|
확장성 | 브로커 추가를 통한 수평 확장, 파티션 분산 | 처리량 및 저장소 용량의 선형 증가 |
내결함성 | 파티션 리플리케이션, ISR 기반 리더 선출 | 개별 브로커 장애 시 데이터 유실 및 서비스 중단 방지 |
데이터 지속성 | 디스크에 메시지 지속 저장, 액세스 패턴 최적화 | 메모리 부족 시 데이터 유실 위험 감소, 재시작 후 데이터 복구 가능 |
이러한 설계는 프로듀서와 컨슈머가 서로 직접 연결되지 않는 이벤트 기반 아키텍처의 이점과 결합된다. 시스템의 일부 구성 요소가 일시적으로 중단되더라도, Kafka 자체가 버퍼 역할을 하며 데이터를 안정적으로 보유한다. 결과적으로 전체 데이터 파이프라인의 가용성과 복원력이 크게 향상된다.
Apache Kafka는 데이터를 영구적으로 저장하는 로그 기반의 메시지 시스템으로, 데이터의 보존 기간과 삭제 방식을 제어하는 다양한 정책을 제공한다. 이러한 정책은 디스크 공간 관리와 데이터 접근성 간의 균형을 맞추는 데 핵심적이다.
데이터 보존의 기본 단위는 토픽이며, 주로 보존 기간(Retention Time)과 보존 크기(Retention Size) 두 가지 기준으로 설정된다. 가장 일반적인 방식은 retention.ms 설정을 통해 메시지가 브로커에 도착한 시점부터 특정 시간(예: 7일)이 지나면 자동으로 삭제하는 것이다. 대안으로 retention.bytes를 설정하여 특정 파티션이 지정된 크기(예: 1GB)에 도달하면 오래된 데이터부터 삭제할 수도 있다. 두 정책 중 먼저 충족되는 조건에 따라 데이터가 삭제된다. 또한, cleanup.policy 설정을 compact로 변경하면 키 기반 로그 압축(Log Compaction) 정책을 적용할 수 있다. 이 정책은 동일한 키를 가진 메시지 중 가장 최신의 값만을 유지하고 이전 값을 삭제하여, 각 키의 최종 상태를 유지하면서도 저장 공간을 효율적으로 관리한다[2].
이러한 정책은 운영 요구사항에 따라 세부적으로 조정된다. 실시간 분석 파이프라인에서는 짧은 보존 기간(몇 시간에서 몇 일)을, 이벤트 소싱이나 감사 로그 저장과 같은 경우에는 훨씬 긴 기간(수주에서 수개월) 또는 무제한 보존을 설정하기도 한다. 데이터 삭제는 백그라운드에서 주기적으로 수행되며, 설정된 보존 정책을 초과한 세그먼트 파일을 제거하는 방식으로 이루어진다. 관리자는 kafka-configs.sh 도구를 사용하거나 토픽 생성 시 옵션을 지정하여 토픽별로 보존 정책을 유연하게 구성할 수 있다.

카프카는 높은 처리량, 낮은 지연 시간, 그리고 확장성을 바탕으로 다양한 실시간 데이터 처리 시나리오에서 핵심적인 역할을 수행한다. 주요 사용 사례로는 실시간 데이터 파이프라인, 이벤트 기반 아키텍처, 그리고 로그 집계를 꼽을 수 있다.
가장 대표적인 사용 사례는 시스템 간 데이터를 안정적으로 이동시키는 실시간 데이터 파이프라인 구축이다. 카프카는 데이터베이스의 변경 사항, 애플리케이션 로그, 센서 데이터 등 다양한 소스에서 발생하는 대량의 데이터를 중앙 카프카 클러스터로 수집한다. 이후 이 데이터는 Hadoop, 데이터 웨어하우스, 스트림 처리 엔진, 또는 다른 마이크로서비스와 같은 다수의 목적지로 실시간에 가깝게 전달된다. 이 과정에서 카프카는 데이터의 버퍼 역할을 하며, 생산자와 소비자 시스템 간의 결합을 느슨하게 만들어 시스템의 유연성과 신뢰성을 높인다.
또한, 카프카는 현대적인 마이크로서비스 아키텍처의 핵심인 이벤트 기반 아키텍처 구현에 적합하다. 서비스 간 통신을 동기적인 API 호출이 아닌 비동기적인 이벤트 발행 및 구독 방식으로 전환할 때 카프카를 중앙 이벤트 버스로 활용한다. 예를 들어, '주문 생성' 이벤트가 발생하면, 이 이벤트를 구독하는 재고 관리 서비스, 결제 서비스, 배송 알림 서비스 등이 각자의 비즈니스 로직을 독립적으로 수행한다. 이는 시스템의 확장성과 장애 격리성을 크게 향상시킨다.
마지막으로, 카프카는 분산 시스템에서 생성되는 방대한 양의 로그와 이벤트 데이터를 집계하고 중앙화하는 데 널리 사용된다. 각 애플리케이션 서버는 로그를 카프카 토픽에 지속적으로 전송하며, ELK 스택 (Elasticsearch, Logstash, Kibana)이나 플루언티드(Fluentd)와 같은 도구들이 이 토픽을 소비하여 로그를 수집, 색인, 저장 및 시각화한다. 이 접근 방식은 로그 수집 인프라를 단순화하고, 실시간 로그 모니터링과 분석을 가능하게 한다.
사용 사례 | 핵심 가치 | 주요 구성 요소 |
|---|---|---|
실시간 데이터 파이프라인 | 시스템 간 데이터 이동, 결합도 감소 | |
이벤트 기반 아키텍처 | 비동기 통신, 확장성, 장애 격리 | 토픽, 이벤트 프로듀서, 이벤트 컨슈머 |
로그 집계 | 로그 중앙화, 실시간 모니터링 | 로그 프로듀서, Kafka Connect, 로그 처리/저장소 |
실시간 데이터 파이프라인은 Apache Kafka의 가장 대표적인 사용 사례 중 하나이다. 이는 다양한 소스 시스템에서 발생하는 데이터를 실시간으로 수집, 처리, 변환하여 다른 시스템으로 전달하는 흐름을 구축하는 것을 의미한다. 기존의 배치 기반 데이터 처리와 달리, 데이터가 생성되는 즉시 파이프라인을 통해 흐르기 때문에 분석이나 의사 결정에 필요한 최신 정보를 거의 실시간에 가깝게 제공할 수 있다.
Kafka는 이러한 파이프라인의 중앙 허브 역할을 한다. 프로듀서는 데이터베이스 변경 로그, 애플리케이션 로그, 센서 데이터, 웹사이트 클릭 스트림 등 다양한 소스에서 데이터를 실시간으로 토픽에 발행한다. 반면, 컨슈머는 해당 토픽을 구독하여 데이터를 읽어와 실시간 분석 시스템, 검색 인덱스, 데이터 웨어하우스, 알림 시스템 등 다양한 목적지로 전송한다. 이 구조는 소스와 목적지 시스템 간의 직접적인 결합을 제거하여 시스템의 유연성과 확장성을 크게 향상시킨다.
실시간 데이터 파이프라인의 일반적인 구성 요소와 Kafka의 역할은 다음과 같다.
구성 요소 | 설명 | Kafka의 역할 |
|---|---|---|
데이터 소스 | RDBMS, 애플리케이션 서버, IoT 디바이스, 로그 파일 등 | 프로듀서를 통해 데이터를 지속적으로 발행 |
수집 계층 | 데이터를 중앙 집중화하는 계층 | 고가용성 클러스터로 데이터를 버퍼링하고 안정적으로 저장 |
처리/변환 계층 | 데이터 필터링, 정제, 강화, 집계 등을 수행 | Kafka Streams나 Kafka Connect를 활용한 스트림 처리 플랫폼 제공 |
목적지 | 컨슈머를 통해 처리된 데이터를 안정적으로 전송 |
이러한 파이프라인을 통해 기업은 고객 행동 분석, 사기 탐지, 시스템 상태 모니터링, 실시간 추천 엔진 등 다양한 실시간 애플리케이션을 구축할 수 있다. Kafka의 높은 처리량과 낮은 지연 시간, 그리고 강력한 내구성은 실시간 데이터 흐름의 핵심 요구사항을 충족시키는 데 기여한다.
이벤트 기반 아키텍처(Event-Driven Architecture, EDA)는 시스템의 구성 요소 간 통신이 이벤트의 생산, 감지, 소비 및 반응을 통해 이루어지는 소프트웨어 설계 패러다임이다. Apache Kafka는 이러한 아키텍처를 구현하는 데 있어 핵심적인 이벤트 브로커 또는 이벤트 백플레인의 역할을 한다. 이벤트는 시스템 내에서 발생한 상태 변화나 중요한 사건을 나타내는 기록이며, Kafka는 이러한 이벤트 메시지를 안정적으로 저장하고 배포하는 플랫폼을 제공한다.
이 아키텍처에서 프로듀서는 특정 토픽에 이벤트를 발행한다. 이벤트를 필요로 하는 다양한 컨슈머 애플리케이션은 해당 토픽을 구독하여 독립적으로 이벤트를 처리한다. 이는 전통적인 동기식 요청-응답 모델과 달리, 발행자와 구독자 간의 느슨한 결합을 가능하게 한다. 하나의 이벤트가 발행되면, 여러 하류 시스템이 각자의 속도와 비즈니스 로직에 따라 이를 처리할 수 있다.
이 접근 방식은 복잡한 분산 시스템을 구성하는 데 유리한 특성을 제공한다. 시스템의 확장성이 향상되며, 새로운 기능을 추가하더라도 기존 시스템을 크게 변경하지 않고 새로운 컨슈머를 연결하기만 하면 된다. 또한 장애가 발생한 특정 서비스가 다른 서비스의 정상 작동에 직접적인 영향을 미치지 않는 격리성을 제공한다. 마이크로서비스 아키텍처와의 조합이 특히 효과적인 이유이다.
특징 | 설명 |
|---|---|
느슨한 결합 | 서비스 간 직접적인 의존성이 없어 시스템의 유연성과 유지보수성이 높아진다. |
확장성 | 파티션을 통해 이벤트 처리량을 수평적으로 확장할 수 있다. |
회복력 | 이벤트가 Kafka에 지속되어 있어, 컨슈머 장애 시 재처리가 가능하다. |
실시간성 | 이벤트 발생 후 거의 실시간에 가깝게 하류 시스템에 전달된다. |
일반적인 사용 패턴으로는 주문 생성, 재고 변경, 사용자 활동 추적과 같은 도메인 이벤트의 전파가 있다. 예를 들어, '주문 완료' 이벤트가 발행되면, 재고 관리, 배송 준비, 포인트 적립, 분석 데이터베이스 동기화 등 여러 서비스가 이를 동시에 구독하여 각자의 작업을 수행한다.
로그 집계는 Apache Kafka의 가장 대표적이고 초기부터 널리 사용된 사용 사례 중 하나이다. 이는 다수의 서버나 분산 시스템에서 생성되는 방대한 양의 로그 데이터를 중앙에서 실시간으로 수집, 저장, 처리하기 위한 목적으로 활용된다.
기존의 로그 수집 방식은 각 애플리케이션 서버에 로그 파일을 기록하고, 이를 주기적으로 수집하여 HDFS나 S3 같은 저장소에 옮기는 배치 처리 방식이 일반적이었다. 반면, 카프카를 사용하면 애플리케이션은 로그 메시지를 프로듀서를 통해 카프카 토픽에 실시간으로 발행한다. 각 로그 유형(예: 애플리케이션 로그, 시스템 로그, 접근 로그)은 별도의 토픽으로 구분될 수 있다. 이후 컨슈머를 통해 Elasticsearch, Splunk 같은 검색 및 분석 시스템으로 전송하거나, Hadoop 클러스터로 보내 대규모 배치 분석을 수행할 수 있다.
이 방식은 몇 가지 뚜렷한 장점을 제공한다. 첫째, 로그 생성 애플리케이션과 로그 소비 시스템 간의 결합도를 낮춘다. 애플리케이션은 단지 카프카에 로그를 보내기만 하면 되며, 로그의 최종 저장소나 처리 방식이 변경되어도 애플리케이션 코드를 수정할 필요가 없다. 둘째, 높은 처리량과 실시간성을 보장한다. 카프카의 고성능 스트리밍 특성으로 인해 초당 수백만 건의 로그 메시지를 처리할 수 있다. 셋째, 내결함성과 데이터 안정성을 제공한다. 리플리케이션을 통해 로그 데이터가 손실되지 않도록 보장하며, 컨슈머 장애 시에도 오프셋을 통해 중단 지점부터 다시 처리할 수 있다.
기존 방식의 문제점 | 카프카 기반 로그 집계의 해결 방식 |
|---|---|
파일 기반 수집으로 실시간성 부족 | 실시간 스트리밍 수집 및 전달 |
수집 스크립트 장애 시 데이터 유실 가능성 | 내결함성 있는 메시지 큐로 데이터 보존 |
소비 시스템 과부하 시 데이터 처리 지연 | 버퍼 역할을 수행하여 비동기 처리 가능 |
다양한 소비 시스템에 대한 직접 연결 복잡성 | 단일 엔드포인트(카프카)를 통한 중계 |
결과적으로, 카프카는 로그 데이터의 통합된 허브 역할을 수행하며, 신뢰할 수 있고 확장 가능한 로그 집계 인프라의 핵심 구성 요소로 자리 잡았다.

Kafka 클러스터의 운영은 일반적으로 주키퍼 앙상블을 통한 브로커 노드의 조정에 기반합니다. 클러스터를 구성할 때는 브로커의 수, 파티션 수, 리플리케이션 팩터를 시스템의 처리량, 가용성, 내결함성 요구사항에 맞게 결정해야 합니다. 높은 처리량을 위해서는 파티션 수를 증가시키는 것이 일반적이지만, 너무 많은 파티션은 파일 핸들러 오버헤드와 메타데이터 복잡성을 증가시킬 수 있습니다. 리플리케이션 팩터는 보통 3으로 설정하여 데이터의 안정성을 보장합니다.
효율적인 모니터링은 클러스터의 건강 상태를 유지하는 데 필수적입니다. 주요 모니터링 지표로는 브로커별 초당 메시지 처리량, 네트워크 입출력, 디스크 사용량, ISR의 크기 변동, 컨슈머 래그 등이 있습니다. 성능 튜닝은 주로 프로듀서, 브로커, 컨슈머의 설정을 조정하여 이루어집니다. 프로듀서 측에서는 배치 크기와 압축 방식을, 브로커 측에서는 로그 세그먼트 크기와 플러시 정책을 조정할 수 있습니다. 컨슈머의 처리 속도를 높이기 위해 파티션 수를 늘리거나 컨슈머 그룹 내 인스턴스를 추가하는 방식으로 병렬 처리를 확장합니다.
모니터링 영역 | 주요 지표 | 설명 |
|---|---|---|
브로커 | Under Replicated Partitions | 리플리케이션이 지연되거나 실패한 파티션 수. 클러스터 이상 신호. |
브로커 | Active Controller Count | 클러스터를 관리하는 활성 컨트롤러 수. 정상적으로는 1이어야 함. |
토픽/파티션 | Consumer Lag | 컨슈머가 처리하지 못한 메시지의 양. 파이프라인 지연을 나타냄. |
자원 | Disk Usage, Network IO | 브로커의 디스크 공간과 네트워크 대역폭 사용률. |
주기적인 유지보수 작업으로는 브로커 노드의 롤링 재시작, 토픽의 파티션 수 증가, 오래된 데이터의 삭제 등이 있습니다. 로그 압축이 활성화된 토픽의 경우, 주기적인 압축 작업이 디스크 공간을 효율적으로 관리하는 데 도움이 됩니다. 또한, 보안 설정(예: SSL, SASL)과 접근 제어 목록이 의도대로 적용되고 있는지 정기적으로 점검해야 합니다.
카프카 클러스터는 여러 대의 브로커로 구성된다. 일반적으로 프로덕션 환경에서는 최소 3개 이상의 브로커로 클러스터를 구성하여 내결함성을 확보한다. 각 브로커는 고유한 ID로 식별되며, 하나 이상의 주키퍼 또는 KRaft[3] 앙상블에 연결되어 메타데이터 관리와 컨트롤러 선출 등의 조정 작업을 수행한다.
클러스터 구성 시 주요 고려 사항은 브로커의 수, 하드웨어 사양, 네트워크 구성이다. 브로커 수는 필요한 처리량, 복제 팩터, 가용성 요구사항에 따라 결정된다. 하드웨어 측면에서는 디스크 I/O 성능이 가장 중요한 요소이며, SSD 사용이 권장된다. 네트워크는 브로커 간, 그리고 프로듀서/컨슈머와의 통신에 충분한 대역폭과 낮은 지연 시간을 보장해야 한다.
구성 파일(server.properties)을 통해 각 브로커의 세부 설정을 관리한다. 필수 설정 항목은 다음과 같다.
설정 항목 | 설명 | 예시 값 |
|---|---|---|
| 클러스터 내 고유 브로커 식별자 |
|
| 브로커가 클라이언트 요청을 수신할 주소 |
|
| 파티션 로그 데이터가 저장될 디렉토리 |
|
| 연결할 주키퍼 앙상블 주소 (KRaft 미사용 시) |
|
| 새로 생성되는 토픽의 기본 파티션 수 |
|
클러스터를 배포한 후에는 kafka-topics.sh와 같은 명령줄 도구를 사용해 토픽을 생성하고, 파티션 수와 리플리케이션 팩터를 설정하며, 브로커와 토픽의 상태를 모니터링한다. 클러스터에 브로커를 추가하거나 제거하는 작업은 온라인 상태에서도 가능하며, 이를 통해 시스템의 확장성을 유연하게 관리할 수 있다.
카프카 클러스터의 안정적인 운영과 최적의 성능을 보장하기 위해서는 지속적인 모니터링과 체계적인 성능 튜닝이 필수적이다. 주요 모니터링 지표는 브로커, 프로듀서, 컨슈머 각각에 집중해야 한다. 브로커 수준에서는 네트워크 및 디스크 I/O, CPU 사용률, JVM 가비지 컬렉션 빈도와 지연 시간, 파티션의 리더 불균형 여부, ISR 크기 변화 등을 점검한다. 프로듀서와 컬슈머 측면에서는 프로듀서의 전송 지연, 재시도율, 컬슈머의 지연 및 처리량이 핵심 지표이다. 이러한 지표는 JMX를 통해 노출되며, Prometheus, Grafana와 같은 도구를 활용해 대시보드를 구성하고 이상 징후에 대한 알림을 설정하는 것이 일반적이다.
성능 튜닝은 하드웨어 구성, 카프카 구성, 애플리케이션 구성의 세 가지 차원에서 접근한다. 하드웨어 차원에서는 고성능 SSD 사용, 충분한 메모리 확보, 네트워크 대역폭 확장이 기본이다. 카프카 브로커 구성에서는 num.network.threads, num.io.threads, log.flush.interval.messages, log.flush.interval.ms 등의 파라미터를 워크로드에 맞게 조정하여 처리량과 지연 시간의 균형을 찾는다. 또한, 적절한 리플리케이션 팩터 설정과 파티션 개수 산정은 병렬 처리 성능과 내결함성을 결정하는 핵심 요소이다.
애플리케이션 측면의 튜닝도 중요하다. 프로듀서는 batch.size, linger.ms, compression.type 설정을 통해 네트워크 왕복 횟수를 줄이고 압축 효율을 높일 수 있다. 컬슈머는 fetch.min.bytes, max.poll.records 설정을 조정하여 폴링 효율을 개선하고, 적절한 컬슈머 그룹 내 인스턴스 수를 설정하여 파티션 소비를 균등하게 분배해야 한다. 성능 튜닝은 일회성 작업이 아니라, 데이터 양과 패턴의 변화에 따라 지속적으로 검증하고 최적화해야 하는 과정이다.

Apache Kafka 클러스터의 보안은 인증, 권한 부여, 암호화의 세 가지 주요 축으로 구성된다. 이러한 메커니즘은 무단 접근을 방지하고 데이터의 기밀성과 무결성을 보장하는 데 목적이 있다.
인증은 클라이언트(프로듀서, 컨슈머)나 다른 브로커가 클러스터에 연결할 때 신원을 확인하는 과정이다. 주요 인증 방식으로는 SSL/TLS를 이용한 상호 인증과 SASL 프레임워크를 통한 인증이 있다. SASL은 GSSAPI (Kerberos), PLAIN, SCRAM과 같은 다양한 메커니즘을 지원하여 조직의 보안 인프라에 맞게 선택할 수 있다. 권한 부여는 인증된 사용자나 애플리케이션이 특정 작업(예: 특정 토픽에 데이터 쓰기 또는 읽기)을 수행할 수 있는지를 제어한다. 권한 부여는 ACL을 통해 관리되며, Kafka CLI 도구나 설정 파일을 통해 세밀하게 정의할 수 있다.
보안 영역 | 주요 메커니즘 | 설명 |
|---|---|---|
전송 계층 암호화 | 브로커-클라이언트 및 브로커-브로커 간 통신을 암호화하여 도청을 방지한다. | |
데이터 암호화 | 종단 간 암호화 (애플리케이션 수준) | 프로듀서 측에서 데이터를 암호화하고 컨슈머 측에서 복호화하는 방식으로, 브로커는 암호화된 상태의 데이터만 처리한다. |
저장 데이터 암호화 | OS 또는 디스크 수준 암호화 | 로그 파일이 저장되는 디스크 자체를 암호화하여 물리적 접근으로부터 데이터를 보호한다. |
암호화는 데이터가 네트워크를 통해 전송 중일 때와 저장 중일 때 보호하는 역할을 한다. 전송 계층에서는 SSL/TLS를 적용하여 통신 채널을 암호화하는 것이 일반적이다. 반면, 저장된 데이터 자체를 암호화하려면 애플리케이션 수준에서 종단 간 암호화를 구현하거나, 운영 체제나 디스크의 암호화 기능에 의존해야 한다. 보안 설정은 server.properties와 같은 브로커 구성 파일에서 활성화하고 세부 사항을 정의한다.
Apache Kafka는 SSL/TLS 또는 SASL을 통한 인증을 지원하여 클라이언트와 브로커 간의 신원을 확인한다. 주요 SASL 메커니즘으로는 SASL/PLAIN, SASL/SCRAM, SASL/GSSAPI (Kerberos) 등이 있다. 이를 통해 프로듀서, 컨슈머, 관리 도구 등이 클러스터에 접근하기 전에 자신을 증명해야 한다.
인증된 사용자나 애플리케이션에 대한 접근 제어는 ACL을 통해 이루어진다. ACL은 특정 리소스 (예: 토픽, 컨슈머 그룹, 클러스터)에 대해 특정 작업 (예: 읽기, 쓰기, 생성, 삭제)을 허용하거나 거부하는 규칙이다. ACL은 사용자, 그룹 또는 모든 사용자(*)를 대상으로 설정할 수 있으며, 기본 정책은 모든 접근을 허용하거나 거부하도록 구성할 수 있다.
ACL 관리는 kafka-acls 명령줄 도구를 사용하거나, Kafka Broker 설정 파일을 통해 수행할 수 있다. ACL 정보는 ZooKeeper 또는 Kafka 자체의 내부 토픽(__cluster_metadata)에 저장된다. 보안 강화를 위해 RBAC와 같은 더 세분화된 권한 모델을 제공하는 Confluent Platform과 같은 상용 배포판도 존재한다.
인증 유형 | 설명 | 주요 사용 사례 |
|---|---|---|
클라이언트 인증서를 사용한 상호 인증 | 높은 보안이 요구되는 내부 네트워크 통신 | |
사용자 이름과 비밀번호 기반의 간단한 인증 | 개발 환경 또는 기본적인 보안 요구사항 | |
비밀번호를 서버에 평문으로 저장하지 않는 방식 | SASL/PLAIN보다 향상된 보안이 필요한 환경 | |
Kerberos 프로토콜을 활용한 인증 | 대기업 등 Kerberos 인프라가 구축된 환경 |
Apache Kafka 클러스터 내에서 데이터의 기밀성과 무결성을 보호하기 위해 전송 중 암호화와 저장 데이터 암호화를 지원합니다. 전송 계층 보안(TLS, 이전의 SSL)은 브로커와 클라이언트(프로듀서, 컨슈머, 기타 도구) 간의 통신, 그리고 브로커 간 통신을 암호화하는 데 사용됩니다. 이를 통해 네트워크 스니핑으로부터 데이터를 보호합니다.
데이터 저장 단계에서의 암호화는 Kafka 자체 기능보다는 일반적으로 외부 시스템에 의존합니다. 예를 들어, 토픽 데이터가 저장되는 디스크 볼륨 수준에서 전체 디스크 암호화(FDE)를 적용하거나, 운영 체제나 클라우드 공급자의 암호화 파일 시스템을 활용합니다. 이는 물리적 미디어 분실이나 서버 해킹 시 데이터가 유출되는 것을 방지합니다.
암호화 유형 | 적용 계층 | 주요 목적 | 구현 방식 예시 |
|---|---|---|---|
전송 중 암호화 | 네트워크 | 도청 및 중간자 공격 방지 | |
저장 데이터 암호화 | 디스크/파일 시스템 | 물리적 미디어 유출 시 데이터 보호 | 전체 디스크 암호화, 암호화 파일 시스템(예: LUKS, AWS EBS 암호화) |
암호화 구성은 server.properties 및 클라이언트 설정 파일에서 수행됩니다. 전송 암호화를 위해 TLS 인증서를 구성하고, 보안 프로토콜(SSL 또는 SASL_SSL)을 지정해야 합니다. 암호화는 성능 오버헤드를 동반할 수 있으므로, 보안 요구사항과 처리량 및 지연 시간 요구사항 사이의 균형을 고려하여 적용해야 합니다.

Apache Kafka의 생태계는 핵심 브로커 외에도 데이터 통합과 스트림 처리를 위한 강력한 도구들을 포함한다. 이 에코시스템은 Kafka를 단순한 메시지 큐가 아닌 완전한 스트리밍 플랫폼으로 진화시켰다.
주요 구성 요소로는 Kafka Connect와 Kafka Streams가 있다. Kafka Connect는 외부 시스템(예: 데이터베이스, 클라우드 스토리지, 전통적 메시지 큐)과 Kafka 간에 신뢰할 수 있는 데이터를 주고받기 위한 프레임워크이다. 사전 제작된 커넥터 라이브러리를 제공하여 복잡한 코드 없이도 데이터 파이프라인을 쉽게 구성할 수 있다. Kafka Streams는 클라이언트 라이브러리로, Kafka 토픽의 데이터를 실시간으로 변환, 집계, 조인하는 스트림 처리 애플리케이션을 Java나 Scala로 작성할 수 있게 한다. 상태 저장 연산과 정확히 한 번 처리 의미론을 지원하는 것이 특징이다.
데이터 형식의 호환성을 관리하기 위한 중요한 도구로 Schema Registry가 있다. 이는 Avro, JSON Schema, Protobuf 등의 스키마를 중앙에서 저장하고 관리하며, 프로듀서와 컨슈머 간의 스키마 호환성을 검증한다. 이를 통해 데이터 형식이 변경되어도 애플리케이션이 중단되는 것을 방지할 수 있다. 또한, 클러스터 운영을 위한 명령줄 도구와 GUI 기반의 모니터링 솔루션들도 에코시스템의 일부를 이룬다.
도구/프로젝트 | 주요 목적 | 특징 |
|---|---|---|
외부 시스템과의 데이터 통합 | 선언적 구성, 확장 가능한 커넥터 프레임워크, 단일 메시지 변환 | |
클라이언트 측 스트림 처리 | ||
스트림 처리용 SQL 엔진 | 대화형 SQL 인터페이스, Kafka Streams 위에 구축 | |
스키마 관리 및 호환성 검사 | 중앙 집중식 스키마 저장소, 버전 관리, 직렬화/역직렬화 지원 |
이러한 도구들은 서로 긴밀하게 통합되어 있어, 개발자와 운영자가 종단간 스트리밍 애플리케이션을 더 효율적으로 구축하고 운영할 수 있게 한다.
Kafka Connect는 Apache Kafka와 외부 시스템(예: 데이터베이스, 클라우드 스토리지, 검색 인덱스) 간에 데이터를 안정적으로 스트리밍하기 위한 프레임워크이다. 이 도구는 Kafka 클러스터와 다른 시스템 사이에서 데이터 커넥터를 실행하기 위한 표준화된 방법을 제공하여, 반복적인 데이터 통합 작업을 단순화한다. 커넥터는 소스 커넥터와 싱크 커넥터 두 가지 주요 유형으로 나뉜다. 소스 커넥터는 외부 시스템에서 데이터를 읽어 Kafka 토픽으로 전송하고, 싱크 커넥터는 Kafka 토픽의 데이터를 소비하여 외부 시스템에 쓴다.
Kafka Connect의 핵심 장점은 확장성과 관리 용이성에 있다. 이는 분산 모드 또는 독립 실행형 모드로 실행될 수 있다. 분산 모드에서는 여러 워커 노드에 걸쳐 커넥터 작업을 분산시켜 확장성과 내결함성을 제공한다. 또한 REST API를 통해 커넥터를 쉽게 배포, 구성, 모니터링할 수 있어 운영 부담을 크게 줄인다. 커넥터는 단일 태스크 또는 다중 태스크로 실행될 수 있으며, 각 태스크는 데이터 처리의 일부를 담당하여 병렬 처리를 가능하게 한다.
커넥터 생태계는 매우 풍부하며, Confluent Hub와 같은 커뮤니티 플랫폼을 통해 다양한 사전 제작 커넥터를 제공한다. 주요 커넥터의 예는 다음과 같다.
커넥터 유형 | 시스템 예시 | 설명 |
|---|---|---|
소스 커넥터 | 데이터베이스 변경 사항이나 파일을 Kafka 토픽으로 가져옴 | |
싱크 커넥터 | Kafka 토픽의 데이터를 지정된 대상 시스템에 저장함 |
또한 Kafka Connect는 데이터 변환과 오류 처리를 위한 단일 메시지 변환 기능을 지원하며, Exactly-Once Semantics를 보장할 수 있다. 이를 통해 복잡한 ETL 파이프라인을 구축하지 않고도 신뢰할 수 있는 실시간 데이터 통합 플랫폼을 구성할 수 있다.
Kafka Streams는 Apache Kafka 클러스터에 저장된 데이터를 실시간으로 처리하기 위한 클라이언트 라이브러리이다. 이 라이브러리는 Kafka를 스트림 처리 플랫폼으로 확장하는 핵심 구성 요소 중 하나로, 별도의 외부 처리 클러스터 없이도 Kafka 토픽의 데이터를 읽고, 변환하고, 집계하여 다른 토픽에 다시 쓸 수 있는 기능을 제공한다. Java와 Scala 애플리케이션에 내장되어 실행되며, 마이크로서비스나 독립 실행형 애플리케이션의 형태로 배포된다.
주요 기능으로는 상태 저장(stateful) 및 상태 비저장(stateless) 연산, 윈도우 기반 집계, 조인 연산 등이 포함된다. 예를 들어, 사용자 클릭 스트림을 실시간으로 집계하거나, 여러 관련 스트림의 데이터를 결합하는 작업을 쉽게 구현할 수 있다. 내부적으로는 토폴로지를 구성하는 태스크 단위로 병렬 처리를 수행하며, 상태 저장 연산을 위한 로컬 RocksDB 저장소를 활용한다.
다른 스트림 처리 프레임워크와 비교했을 때, Kafka Streams는 Kafka와 긴밀하게 통합되어 있다는 점이 특징이다. 카프카 컨슈머 그룹 프로토콜을 기반으로 자동으로 확장성과 내결함성을 제공하며, Exactly-Once Semantics(정확히 한 번 처리)를 지원한다. 또한 DSL(고수준 선언형 API)과 Processor API(저수준 명령형 API) 두 가지 프로그래밍 모델을 제공하여 개발자의 요구에 맞는 유연성을 보장한다.
특징 | 설명 |
|---|---|
라이브러리 | 별도의 클러스터가 필요 없는 경량 라이브러리이다. |
처리 보장 | At-Least-Once, Exactly-Once Semantics를 지원한다. |
상태 관리 | 로컬 상태 저장소와 변경 로그 토픽을 통해 상태를 복원한다. |
확장성 | 애플리케이션 인스턴스를 추가하면 자동으로 파티션 재분배가 이루어진다. |
Kafka Streams 애플리케이션은 이벤트 스트림을 실시간으로 변환하거나, KTable을 통해 최신 상태의 뷰를 유지하는 등 복잡한 스트림 처리 로직을 구축하는 데 널리 사용된다. 이는 Kafka Connect나 Schema Registry와 함께 Kafka 에코시스템을 구성하는 중요한 요소이다.
Schema Registry는 아파치 카프카 생태계에서 Avro, JSON Schema, Protobuf와 같은 스키마를 중앙에서 저장하고 관리하기 위한 서버 애플리케이션이다. 이는 Confluent 플랫폼의 핵심 구성 요소로 개발되었으며, 데이터 직렬화와 호환성 보장을 위한 표준화된 접근 방식을 제공한다. 프로듀서와 컨슈머는 Schema Registry에 등록된 스키마를 참조하여 데이터를 직렬화하거나 역직렬화한다. 이를 통해 페이로드 크기를 줄이고, 데이터 형식의 일관성을 유지하며, 스키마의 진화를 안전하게 관리할 수 있다.
주요 기능은 스키마의 버전 관리와 호환성 검사이다. 새로운 스키마가 등록될 때, Schema Registry는 구성된 호환성 정책(예: 백워드 호환성, 포워드 호환성, 풀 호환성)에 따라 기존 버전과의 호환성을 자동으로 검증한다. 호환성 검사를 통과하지 못하면 등록이 거부되어 데이터 파이프라인의 중단을 방지한다. 또한 스키마 ID를 통해 스키마를 효율적으로 조회할 수 있으며, RESTful API를 제공하여 다양한 클라이언트와 통합이 용이하다.
구성 요소 | 설명 |
|---|---|
스키마 저장소 | |
호환성 검사기 | 새로운 스키마 등록 시 지정된 정책에 따른 호환성을 검증하는 모듈. |
REST API | 스키마 등록, 조회, 삭제 등을 위한 인터페이스. |
클라이언트 직렬화기 | 프로듀서/컨슈머 애플리케이션에 내장되어 Schema Registry와 통신하는 라이브러리. |
사용 시 이점은 명확하다. 데이터 형식의 불일치로 인한 오류를 사전에 방지하고, 스키마 에볼루션을 지원하여 장기적으로 운영되는 시스템의 유지보수성을 높인다. 또한 Avro와 같은 이진 형식을 사용할 때 스키마 정보를 매 메시지에 포함시키지 않고 짧은 스키마 ID만 전송하면 되므로 네트워크 대역폭과 저장 공간을 절약할 수 있다. Schema Registry는 데이터 거버넌스와 데이터 계약을 실현하는 데 중요한 역할을 한다.

아파치 카프카는 링크드인의 엔지니어링 팀이 내부 시스템의 데이터 파이프라인 문제를 해결하기 위해 개발한 것이 그 기원이다. 링크드인은 수많은 서비스에서 생성되는 활동 데이터를 실시간으로 처리해야 했고, 기존의 메시지 큐 시스템으로는 이를 감당하기 어려웠다. 이 필요성에서 탄생한 카프카는 2011년 오픈소스로 공개되었고, 이후 아파치 소프트웨어 재단의 최상위 프로젝트로 성장했다.
카프카의 이름은 작가 프란츠 카프카에서 유래했는데, 이는 시스템이 쓰기 작업에 최적화되어 있어 빠르다는 점에서 착안한 것으로 알려져 있다. 개발자들은 "작가의 이름처럼 시스템도 빠르게 쓸 수 있는 도구가 되길 바랐다"고 설명한다[5]. 이 이름은 기술 커뮤니티 내에서 종종 "카프카스크"라는 별칭으로 불리기도 한다.
카프카의 핵심 설계 철학은 '로그'라는 단순한 자료 구조에 기반한다. 모든 메시지는 파티션 내에서 순차적으로 추가되는 불변의 로그로 관리된다. 이 단순함이 높은 처리량과 내구성을 가능하게 하는 기반이 되었다. 또한, 카프카는 초기에는 주로 로그 집계 도구로 인식되었지만, 시간이 지나며 실시간 스트리밍 플랫폼으로 그 위상이 크게 확장되었다.
연도 | 주요 사건 |
|---|---|
2011 | 링크드인에서 개발되어 오픈소스로 공개됨 |
2012 | 아파치 인큐베이션 프로젝트로 편입됨 |
2014 | 아파치 최상위 프로젝트(TLP)로 승격됨 |
2017 | 주요 기능인 Kafka Streams와 Kafka Connect가 안정화됨 |
2021 |