카프카 스트림즈(Kafka Streams)란?

송현진·2025년 4월 17일
0

Kafka

목록 보기
3/7

❓카프카 스트림즈(Kafka Streams)란?

Kafka Streams는 Kafka에서 들어오는 데이터를 실시간으로 처리하고 다시 Kafka로 내보낼 수 있는 Java 기반의 스트림 처리 라이브러리이다. 기존 Kafka Consumer는 단순히 메시지를 소비하기만 했다면 Kafka Streams는 데이터를 계속 흐르는 '스트림'으로 인식하고 필터링, 변환, 집계, 조인 등 실시간 데이터 처리에 필요한 기능들을 손쉽게 수행할 수 있도록 도와준다.

Kafka Streams의 기본 처리 흐름

Kafka Topic (입력)Kafka Streams (데이터 처리: 필터, 집계, 조인 등)Kafka Topic (출력)

Kafka Streams는 Kafka의 Producer, Consumer 역할을 모두 수행하면서 중간에서 데이터를 실시간으로 가공하는 역할을 한다.

✅ Kafka Streams의 장점

Kafka 친화적인 설계

Kafka 내부 구조(Topic, Partition, Offset 등)에 맞게 설계되어 있어 성능, 신뢰성, 확장성이 좋다.

상태 기반 스트림 처리 지원

단순한 map, filter 외에도 다음과 같은 복잡한 연산이 가능하다.

  • 시간 기반 집계 (예: 5분 동안 접속자 수)
  • Key별 누적 처리 (예: 상품별 클릭 수)
  • KStream-KTable 간 Join 연산 등

이를 통해 Kafka Streams는 단순 메시지 소비를 넘어서 의미 있는 실시간 분석이 가능하다.

장애 복구 및 내구성

내부적으로 사용하는 State Store는 Kafka에 changelog로 복제되어 장애 발생 시 자동 복구가 가능하다.

독립 실행 가능

Kafka Streams는 클러스터가 필요 없다. Spring Boot 애플리케이션에 라이브러리처럼 포함해서 실행 가능하다.

유연한 확장성

Kafka Topic의 Partition 수와 애플리케이션 인스턴스 수에 따라 자동 분산 처리된다. 이로 인해 수평 확장이 자연스럽게 가능하다.

🔄️ Kafka Streams 구조

Kafka Streams는 다음과 같은 구조로 동작한다.

Kafka Topic (source)
 -> StreamsBuilder
 -> KStream/KTable
 -> Processor/StateStore
 -> Kafka Topic (sink)
구성 요소설명
StreamsBuilder스트림 처리의 시작점을 정의하는 객체. 여기서 어떤 토픽을 읽고 어떤 연산을 할지 구성한다.
KStreamKafka Topic에서 읽은 연속적인 이벤트 흐름. 한 번 발생한 데이터는 사라지지 않는다.
KTableKey 기반의 최신 상태를 유지하는 테이블. 동일한 Key에 대한 마지막 값만 저장한다.
Processor필요 시 직접 연산을 정의할 수 있는 저수준 처리 로직
State Store상태 기반 처리를 위한 로컬 저장소. count, sum 같은 집계값을 저장
Kafka Broker데이터를 읽고, 쓴다. Kafka Streams는 Kafka의 Producer/Consumer 역할도 동시에 수행한다.

✏️ Kafka Streams 핵심 개념

KStream

Kafka Topic에서 들어오는 모든 데이터를 이벤트 흐름(Stream)으로 처리한다. 필터링, 맵핑, 변환 등 Stateless 처리에 주로 사용된다.

KStream<String, String> stream = builder.stream("order-topic");

예시: 사주문 이벤트, 클릭 이벤트, 실시간 로그 등

KTable

KStream과 달리 Key 기준으로 최신 상태 하나만 저장한다. 같은 Key의 값이 들어오면 덮어쓴다.

KTable<String, String> userInfo = builder.table("user-topic");

예시: 사용자 정보, 상품 재고 상태 등

주요 연산자 (DSL API)

연산자설명예시
filter()조건 필터링"ERROR"만 추출
mapValues()값 변환대문자로 변환
groupByKey()Key 기준 그룹화Key 기준으로 묶기
count(), aggregate()집계 연산클릭 수, 평균 가격 계산 등
join()다른 Stream/Table과 조인주문 + 결제 상태
windowedBy()시간 단위로 처리5분마다 집계

State Store

Kafka Streams는 상태 기반 처리를 할 수 있도록 로컬에 상태 저장소를 둔다.
내부적으로 RocksDB가 쓰이며 Kafka changelog topic을 통해 이 저장소는 복구될 수 있다. 덕분에 Kafka Streams는 장애 발생 후에도 이전 상태를 그대로 복원할 수 있다

Fault Tolerance (내결함성)

Kafka Streams의 모든 상태 변경은 changelog 토픽에 기록된다. 이 덕분에 어플리케이션이 중단되었다가 재시작하더라도 이전 상태를 그대로 복원할 수 있다. 이 기능은 고가용성이 필요한 실시간 처리 시스템에 매우 유용하다.

✅ Kafka Streams vs Kafka Consumer 차이점

항목Kafka ConsumerKafka Streams
메시지 소비단순 소비소비 + 실시간 처리
상태 저장없음있음 (State Store)
시간 기반 처리복잡함windowedBy()로 간단히 처리
집계 처리직접 구현 필요count(), aggregate()로 제공
장애 복구수동changelog로 자동 복구
실행 형태단독 프로그램Java 라이브러리 형태

📝 배운점

Kafka Streams는 Kafka와 가장 잘 어울리는 스트림 처리 라이브러리라는 점을 이번 학습을 통해 확실히 알게 되었다. 기존 Kafka Consumer를 사용해 집계, 필터링, 조인, 상태 저장 등의 기능을 구현하려면 많은 수작업과 복잡한 로직이 필요하지만 Kafka Streams는 이러한 작업들을 DSL 형태로 간단하게 구성할 수 있다는 것이 가장 큰 장점이다.

특히 State Storechangelog 토픽을 활용한 상태 복구 메커니즘은 장애 상황에서도 안정적으로 데이터를 처리할 수 있게 해줘 운영 환경에서도 매우 유용한 도구라는 생각이 들었다. 또한 별도의 클러스터 없이도 Spring Boot 애플리케이션에 라이브러리 형태로 간편하게 통합할 수 있어 사용성과 배포 편의성 면에서도 강점이 크다고 느꼈다.

profile
개발자가 되고 싶은 취준생

0개의 댓글