스트림즈DSL(Streams Domain Specific Language)이란?
스트림즈DSL는 아파치 카프카(Apache Kafka)의 스트림 처리 라이브러리인 카프카 스트림즈(Kafka Streams)에서 제공하는 고수준 API입니다.
스트림 데이터를 손쉽게 처리하고 변환할 수 있도록 설계된 함수형 프로그래밍 스타일의 API로, 복잡한 스트림 처리 로직을 간결하고 직관적으로 작성할 수 있습니다.
스트림즈 DSL에는 레코드의 흐름을 추상화한 3가지 개념인 KStream, KTable, GlobalKTable이 존재합니다.
이 3가지 개념은 컨슈머, 프로듀서, 프로세서 API에서는 사용되지 않고 스트림즈DSL에서만 사용되는 개념입니다.
KStream
KStream은 레코드의 흐름을 표현한 것으로 메시지 키와 메시지 값으로 구성되어 있는데, 데이터를 조회하면 토픽에 존재하는(또는 KStream에 존재하는) 모든 레코드가 출력됩니다.
컨슈머로 토픽을 구독하는 것과 동일한 선상에서 사용하는 것이라고 볼 수 있습니다.
KTable
KTable은 KStream과 다르게 메시지 키를 기준으로 묶어서 사용하기 때문에 KTable은 유니크한 메시지 키를 기준으로 가장 최신의 레코드를 조회합니다.
새로 데이터를 적재할 때 동일한 메시지 키가 있을 경우 데이터가 업데이트 된다고 볼 수 있습니다.
GlobalKTable
GlobalKTable은 KTable과 동일하게 메시지 키를 기준으로 묶어서 사용하지만, KTable로 선언된 토픽은 1개 파티션이 1개 태스크에 할당되어 사용되고, GlobalKTable로 선언된 포틱은 모든 파티션 데이터가 각 태스크에 할당되어 사용된다는 차이점이 있습니다.
KStream과 KTable 데이터를 조인(join)하기 위해서는 반드시 코파티셔닝(co-partitioning)되어 있어야 하고, 만약 코파티셔닝이 되어있지 않다면 리파티셔닝(repartitioning)하는 과정을 거쳐 코파티셔닝을 진행 후 조인을 해야 합니다.
※ 코파티셔닝(co-partitioning)이란?
조인을 하는 2개 데이터의 파티션 개수가 동일하고 파티셔닝 전략(partitioning stategy)을 동일하게 맞추는 작업
※ 리파티셔닝(repartitioning)이란?
새로운 토픽에 새로운 메시지 키를 가지도록 재배열하는 과정
이렇게 코파티셔닝 되지 않은 KStream과 KTable을 조인해서 사용하고 싶다면 KTable을 GlobalKTable로 선언하여 사용하면 데이터 조인을 쉽게 구현할 수 있습니다.
다만, GlobalKTable을 사용하면 각 태스크마다 모든 데이터를 저장하고 사용하기 때문에 스트림즈 애플리케이션의 로컬 스토리지의 사용량이 증가하고 네트워크, 브로커에 부하가 생기므로 되도록이면 작은 용량의 데이터일 경우에만 사용하고 많은 양의 데이터를 가진 토픽으로 조인할 경우에는 리파티셔닝을 통해 KTable을 사용하는 것을 권장합니다.
'Apache Kafka' 카테고리의 다른 글
카프카 스트림즈(Kafka Streams) - 스트림즈DSL의 주요 옵션 (0) | 2025.02.07 |
---|---|
카프카 스트림즈(Kafka Streams)의 기본 개념 (0) | 2025.02.07 |
카프카 클라이언트(Kafka Client) - 어드민(Admin) API (0) | 2025.01.30 |
카프카 클라이언트(Kafka Client) - 컨슈머(Consumer) API (2/2) (1) | 2025.01.30 |
카프카 클라이언트(Kafka Client) - 컨슈머(Consumer) API (1/2) (0) | 2025.01.29 |