리눅스/kafka
kafka streams란?
정지홍
2024. 11. 3. 10:56
토폴리지 topology
- 2개 이상의 노드들과 선으로 이루어진 집합
- 종류로는 ring , tree star 등이 존재하며, streams에서는 tree형태와 유사하게 사용
- 토폴로지를 이루는 노드를 하나의 processor라고 부른다.
- node와 node를 이은 선을 stream이라고 한다.
- stream은 topic의 data를 뜻하는데, producer와 consumer에서 사용한 record와 동일
- processor에는 3가지 종류 존재
- source processor
- data를 처리하기 위해서 최초로 선언해야하는 노드
- 하나 이상의 topic에서 data를 가져옴
- sink processor
- data를 특정 kafka topic으로 저장하는 역할
- 즉, streams로 처리한 data의 목적지
- stream processor
- 다른 processor가 반환한 data를 처리 ( 처리에는 변환 , 분기 등 존재 )
- source processor
kafka streams란?
- kafka와 함께 실시간 데이터 처리를 쉽게 할 수 있는 스트림 처리 라이브러리
- 데이터를 소비하고 처리하여 다시 kafka에 전송하는 stream processing application을 개발 가능
- 이를 통해, 실시간 데이터 분석 , ETL , 복잡한 이벤트 처리 등 가능
- 데이터를 stateful or stateless로 실시간 변환하여 다른 topic에 적재하는 라이브러리이다.
- 특징...
- 1. 고수준 DSL( 도메인 특정 언어 )
- kafka stream는 stream처리를 단순화 하기 위해 고수준 DSL을 제공( KStream , KTable을 사용해서...)
- KStream
- 지속적으로 변하는 이벤트 데이터를 처리하는 구조로, 각 메시지를 개별 이벤트로 다룸
- 일반적인 stream을 처리하는데 적합
- record의 흐름을 표현한 것으로 key value로 구성됨
- kstream으로 data조회하면 topic에 존재하는 모든 record가 출력됨( consumer로 topic을 subscribe하는 느낌)
- KTable
- 변경이 발생할 때마다 최신 상태를 유지하는 데이터 구조
- 상태 데이터를 기반으로 한 집계와 조인에 적합
- 2. 상태 저장
- kafka streams는 각 processing application이 stateful할 수 있게 상태 저장소(state store)을 제공.
- 다르게 말하면, topic에 적재된 data를 stateful or stateless로 실시간 변환 해서 다른 topic에 적재한다.
- 이를 이용해 내장형 로컬 db를 사용해 각 인스턴스의 로컬에서 data를 유지하고, 장애 발생시 kafka의 changlog로 상태를 복원 가능
- kafka streams는 각 processing application이 stateful할 수 있게 상태 저장소(state store)을 제공.
- 3. 상태별 장애 복구
- kafka streams는 각 partition을 개별 처리하니, 장애 발생시 다른 인스턴스로 재할당 가능
- 장애 발생해도, exactly once할 수 있는 fault tolerant system을 가짐
- data는 kafka log에 저장되어 복구가 가능하며, 로컬 상태 저장소도 자동으로 복구 가능
- => 이렇게 높은 가용성 및 장애 복원력을 가짐
- 1. 고수준 DSL( 도메인 특정 언어 )
- streams DSL로 데이터를 처리하는 예시
- 메시지 값을 기반으로 topic의 분기처리
- 특정 시간동안 들어온 data수의 통계
- 서로 다른 두 topic으로 새로운 data를 만들어 내는 것
- processor api로 구현하는 데이터 처리 예시
- 일정한 interval마다 data 처리
- message value에 따라서 topic을 가변적 전송
kafka stream의 task란?
- streams application을 실행하면 생기는 데이터 처리 최소 단위
- 만약 3개의 partition으로 이루어진 topic을 처리하는 stream application을 실행하면, 내부에 3개의 task가 생김
- task들은 스레드들로 묶임.

- 단, 실제 현장에서는 서버가 장애가 발생해도 스트림 처리를 할 수 있게 병렬로 구성한다.
