Kafka : Kafka Streams에 관하여

1. Kafka Streams 개요

Kafka Streams는 토픽에 적재된 데이터를 상태기반(Stateful) 또는 비상태기반(Stateless)으로 실시간 변환 및 토픽에 적재하는 라이브러리.
카프카의 스트림 데이터 처리를 위해 아파치 스파크(Apache Spark), 아파치 플링크(Apache Flink), 아파치 스톰(Apache Storm), 플루언트디(Fluentd)와 같은 다양한 오픈소스 애플리케이션 존재.
Kafka Streams는 카프카에서 공식적으로 지원.

2. Kafka Streams 애플리케이션의 Task와 Partition

Streams 애플리케이션은 내부적으로 스레드를 1개 이상 생성하며, 스레드는 1개 이상의 Task를 갖음.
Streams 의 Task는 Streams 애플리케이션을 실행하면 생성되며 데이터 처리 최소 단위.

3개의 파티션으로 구성된 토픽을 처리함에 있어 Streams 애플리케이션은 내부적으로 3개의 Task를 갖음.

3. Kafka Streams Topology

Topology 란 2개 이상의 노드들과 선의 조합.
Topology 는 링형, 트리형, 성형 등이 있음.
Kafka Streams 에서는 Topology를 구성하는 노드 하나를 “프로세서(processor)” 라고 함.
Kafka Streams 에서는 Topology를 구성하는 선 하나를 “스트림(stream)” 이라고 함.

4. Kafka Streams Processor

종류 설명
Source Processor 데이터를 처리하기 위해 최초 노드, 하나 이상의 토피에서 데이터를 가져오는 역할
Stream Processor 다른 Processor가 반환한 데이터를 철하는 역할. 변환, 분기처리와 같은 로직 등을 수행
Sink Processor 데이터를 특정 카프카 토픽으로 저장하는 역할

Kafka Streams 개발은 Kafka Streams DSL (Domain Specific Language)과 Kafka Processor API를 활용한 2가지 방법이 있음.

5. Kafka Streams DSL (Domain Specific Language)

Kafka Streams DSL은 레코드의 흐름을 추상화한 KStream, KTable, GlobalKTable 3가지가 있음.

  • KStream

KStream 은 레코드의 흐름.
KStream 을 통해 데이터 조회 시, 토픽에 존재하는 모든 레코드 출력.
컨슈머로 토픽을 구독하는 것과 동일.

  • KTable

메세지 키를 기준으로 묶어서 활용.
토픽의 모든 레코드를 조회할 수 있는 KStream과는 다르게 유니크한 메세지 키를 통해 가장 최신 레코드를 사용.
파티션 1개와 대응하여 해당 파티션에 대한 데이터로 채워짐.

  • GlobalKTable

KTable과 동일하게 메세지 키를 기준으로 묶어서 사용.
KTable과 다르게 모든 파티션에 대응하여 데이터가 채워짐.

6. Kafka Streams & KTable, GlobalKTable

  • Streams 와 KTable 조인

KStream 와 KTable를 조인하려면 반드시 코파티셔닝(Co-partitioning)되어야 함.
코파티셔닝(Co-partitioning)이란 조인을 하는 2개의 데이터 파티션 개수가 동일하고 파티셔닝 전략(partitioning stretegy)을 동일하게 맞추는 작업.
KStream과 KTable의 메세지 키가 동일한 경우 조인을 수행.

조인를 수행하려는 토픽들에 대해 코파티셔닝(Co-partitioning)을 보장할 수 없음.

이런 경우 조인을 수행할 수 없음(코파티셔닝이 되지 않은 2개의 토픽을 조인하는 로직 수행시 TopologyException 발생).
조인 수행을 위해서는 리파티셔닝(repartitioning) 과정이 필요.

  • Streams 와 GlobalKTable 조인

GlobalKTable은 코파티셔닝되지 않은 Kstream과 데이터 조인 가능.
GlobalKTable은 Stream의 모든 Task에게 동일하게 공유가 가능.
모든 데이터를 저장하고 사용하기 때문에 로컬 스토리지 사용량이 증가, 네트워크, 브로커 부하가 클 수 있음.
많은 양의 데이터를 가진 토픽에 대한 조인은 리파티셔닝을 통해 KTable을 사용을 권장.

7. Kafka Streams Processor API

Kafka : Kafka Producer에 관하여

1. Kafka Producer 의 시작

2. Kafka Producer 주요 옵션

옵션 설명
bootstrap.servers 카프카 클러스터에 연결하기 위한 호스트, 포트 정보 설정
client.dns.lookup 클라이언트가 하나의 IP와 연결하지 못할 경우에 다른 IP로 시도하는 설정
acks 카프카 메세지 수신에 대한 확인 수준 설정
buffer.memory 프로듀서가 카프카로 데이터를 보내기 위한 대기 메모리 바이트(byte) 설정
compression.type 프로듀서 메세지 전송시 압축 타입 설정(none, gzip, snappy, lz4, zstd 등)
max.in.flight.requests.per.connection 프로듀서가 한 번에 몇 개의 요청(Request)을 전송할 것인가에 대한 설정(ACK 없이 전송할 최대 요청 수)
retries 일시적인 장애에 대해 몇 번 재시도 할 것인가에 대한 설정
batch.size 프로듀서의 배치의 사이즈를 결정하는 결정하는 설정
linger.ms 프로듀서의 배치 메세지를 보내기 전에 추가적인 메세지를 위해 기다리는 시간 설정
transactional.id ???
enable.idempotence ???

3. Kafka Producer Transaction