본문 바로가기
1. 개발/1.4. 데이터 분석

Kafka Streams는 일반 Consumer랑 뭐가 다를까?

by 엉짱 2026. 2. 6.
반응형

일반 컨슈머가 단순히 창고에서 물건을 꺼내오는 일꾼이라면, 카프카 스트림즈는 창고 옆에 붙어서 들어오는 재료를 즉시 조립하고 요리해 새로운 제품을 만들어내는 '자동화 생산 라인'과 같습니다.

일반 컨슈머와 스트림즈의 결정적 차이, 그리고 스트림즈만이 가진 강력한 무기들을 파헤쳐 보겠습니다!


🛠️ Kafka Streams vs 일반 Consumer: "도구인가, 프레임워크인가"

가장 큰 차이는 '추상화 수준'입니다. 일반 컨슈머는 데이터를 가져오는 기능만 제공하지만, 카프카 스트림즈는 데이터를 가공하는 복잡한 로직(필터링, 조인, 집계 등)을 이미 다 만들어놓은 라이브러리입니다.

1. 상태 저장소(State Store)의 유무

일반 컨슈머로 "최근 1시간 동안의 주식 거래 합계"를 구하려면 어떻게 해야 할까요?

  • 일반 컨슈머: 데이터를 읽어서 외부 데이터베이스(Redis 등)에 저장하고, 거기서 다시 합계를 구해야 합니다. 외부 시스템과의 통신 때문에 느려지고 복잡해지죠.
  • 카프카 스트림즈: 내부에 RocksDB라는 고성능 상태 저장소를 내장하고 있습니다. 별도의 DB 없이도 자신의 메모리와 로컬 디스크를 활용해 실시간 합계를 순식간에 계산합니다.

2. KStream과 KTable: "흐름과 상태의 조화"

카프카 스트림즈만의 독보적인 개념입니다.

  • KStream (흐름): 모든 데이터의 이력을 기록합니다. "A가 삼성전자를 1주 샀다", "B가 2주 샀다"는 개별 사건들이죠.
  • KTable (상태): 특정 시점의 최종 결과를 보여줍니다. "삼성전자의 현재 총 거래량은 3주다"라는 현재 상태입니다.
  • Stream-Table Dualism: 스트림즈는 이 둘을 자유자재로 변환합니다. 개별 사건(Stream)을 합쳐서 상태(Table)를 만들고, 상태의 변화를 다시 사건으로 기록할 수 있습니다.

🚀 카프카 스트림즈만이 가진 3대 핵심 무기

왜 굳이 일반 컨슈머 대신 스트림즈를 써야 하는지 그 기술적 이유를 더 깊이 들어가 보겠습니다.

① 윈도잉(Windowing): "시간을 쪼개는 기술"

실시간 분석에서 가장 중요한 것은 "특정 시간 동안"의 통계입니다.

  • Tumbling Window: 1분 단위로 겹치지 않게 딱딱 끊어서 합산 (예: 1시1시 1분, 1시 1분1시 2분)
  • Hopping Window: 1분 단위 합산인데 30초마다 갱신 (예: 1시1시 1분, 1시 30초1시 1분 30초)
  • Sliding Window: 특정 이벤트가 발생한 시점 전후의 시간대를 계산
    스트림즈는 이 복잡한 시간 계산 로직을 단 몇 줄의 코드로 구현할 수 있게 해줍니다.

② 딱 한 번 처리 (Exactly-once Processing) 보장

앞서 공부했던 '딱 한 번' 처리를 구현하기 위해 일반 컨슈머는 트랜잭션 API를 직접 코딩해야 하지만, 카프카 스트림즈는 설정에서 processing.guarantee="exactly_once_v2" 한 줄만 넣으면 내부적으로 모든 오프셋 관리와 상태 저장을 트랜잭션으로 묶어 완벽하게 처리합니다.

③ 토폴로지(Topology) 기반의 데이터 흐름 설계

스트림즈는 데이터를 처리하는 과정을 노드(Node)선(Edge)으로 이루어진 그래프로 설계합니다.

  • Source Processor: 카프카 토픽에서 데이터를 읽어옴
  • Stream Processor: 데이터를 변환, 필터링, 집계함
  • Sink Processor: 가공된 데이터를 다시 다른 카프카 토픽으로 보냄
    이 구조 덕분에 복잡한 파이프라인도 가독성 좋고 유지보수가 쉬운 코드로 완성됩니다.

⚖️ 일반 Consumer vs Kafka Streams 선택 기준

비교 항목 일반 Consumer Kafka Streams
주요 용도 단순 데이터 읽기, 외부 DB 저장 실시간 데이터 가공, 집계, 조인
외부 의존성 상태 저장을 위해 외부 DB 필요 내장 상태 저장소(RocksDB) 사용
개발 난이도 단순하지만 복잡한 로직은 직접 구현 초기 학습 곡선은 있으나 고급 기능 강력
운영 환경 어떤 어플리케이션에서도 가능 자바/스칼라 어플리케이션만 지원
확장성 컨슈머 그룹 단위 확장 어플리케이션 인스턴스 단위 확장

💡 실전 시나리오: "주식 테마주 실시간 탐지기"

'테마가 터질 종목'을 찾는 시나리오에 적용해 봅시다.

  1. 데이터 입력: 모든 종목의 실시간 거래 로그가 카프카 토픽으로 쏟아집니다.
  2. 가공 (Kafka Streams):
  • Filter: 거래량이 평소 대비 500% 이상 폭증하는 종목만 골라냅니다.
  • Window: 최근 10분간 해당 종목을 언급하는 뉴스/토론방 키워드를 합산합니다.
  • Join: 거래량 폭증 데이터와 키워드 데이터를 결합해 특정 '테마'인지 판단합니다.
  1. 결과 출력: "지금 '상폐 위기 탈출' 테마 터짐!" 이라는 메시지를 새로운 토픽으로 쏩니다.

이 모든 과정이 별도의 DB 통신 없이 스트림즈 내부에서 수 밀리초 만에 처리됩니다.


📊 요약 정리

  1. 단순 배달이나 다른 곳(DB, S3)에 적재하는 게 목적이라면 → 일반 Consumer가 가볍고 좋습니다.
  2. 데이터를 합치고(Join), 시간 단위로 계산(Window)하고, 새로운 데이터 스트림을 생성해야 한다면 → Kafka Streams가 압도적으로 유리합니다.

반응형