Kafka 스트림즈 알아보기

망7H·2021년 4월 17일
2

이번 포스팅은 [도서] 아파치 카프카 애플리케이션 프로그래밍 with 자바를 베타리딩하며 개인적으로 가장 어렵게 느꼈던 스트림즈에 대해 이해하고 구현해보려 합니다.

1. 카프카 스트림즈

1) 카프카 스트림즈란?

토픽에 적재된 데이터를 처리하고 분석하기 위한 라이브러리라고 정의할 수 있습니다.
여기서 데이터를 처리하고 분석한다는 것을 예로 들면
데이터를 변환, 데이터를 필터링, 데이터를 집계하는 것 등을 예로 들 수 있습니다.
카프카 스트림즈(Kafka Streams)는 라이브러리이므로 애플리케이션에 라이브러리를 적용할지를 사용자가 직접 선택할 수 있습니다.

2) 카프카 스트림즈의 구조

카프카 스트림즈를 사용하기 위해서는 데이터의 흐름을 표현하기 위해
노드와 선으로 이루어진 토폴로지(Topology)라는 개념을 알아야 합니다.

(1) 토폴로지 (Topology)

토폴로지는 노드와 '노드와 노드를 이은 선'으로 이루어져 있는데,
노드는 프로세서(Processor), 선은 스트림(Stream)을 의미합니다.
즉, 데이터를 처리하는 녀석이 노드이고 다음 노드로 넘어가는 데이터를 선이라고 보시면 될 것 같습니다.

(2) 노드, 프로세서 (Processor)

※ 3가지 프로세서의 역할을 이해한다면 스트림즈DSL, 프로세서API 등을 이해하기 용이합니다.
위 그림은 토폴로지의 구성요소들을 간단한 예를 들어 도식화 해본 것입니다.
스트림즈 DSL프로세서 API 모두 그림과 같이 Source Processor가 데이터를 가져오면 Stream Processor가 데이터에 대한 처리를 진행하며, 처리된 데이터는 Sink Processor가 토픽에 저장한다는 큰 흐름은 동일합니다.
차이점은 조금 뒤에 스트림즈를 구현하는 2가지 방법에서 설명드리도록 하겠습니다.

  • 소스 프로세서 (Source Processor)
    소스 프로세서는 토폴로지의 시작 노드이며,
    데이터를 처리하기 위해 최초로 선언해야 하는 노드입니다.
    카프카와 연결된 프로세서이며, 하나 이상의 토픽에서 데이터를 가져오는 역할을 합니다.

  • 스트림 프로세서 (Stream Processor)
    스트림 프로세서는 다른 프로세서(소스 프로세서, 스트림 프로세서)가 반환한 데이터를 처리하는 역할을 합니다.

  • 싱크 프로세서 (Sink Processor)
    싱크 프로세서는 토폴로지의 마지막 노드이며,
    데이터 전달을 위해 마지막에 선언해야 하는 노드입니다.
    카프카와 연결된 프로세서이며, 데이터를 카프카의 특정 토픽으로 저장하는 역할을 합니다.

3) 스트림즈를 구현하는 2가지 방법

(1) 스트림즈 DSL

스트림즈 DSL에는 데이터의 흐름을 추상화한 3가지 개념이 있습니다.
바로 KStream, KTable, GlobalKTable 입니다.

- 스트림즈 DSL의 데이터 흐름 추상화 개념

먼저 상대적으로 이해하기 쉬운 데이터의 흐름인 KStream, KTable의 경우를 개략적으로 표현하면 아래 그림과 같습니다.

  • KStream
    KStream으로 데이터를 조회하면 토픽에 존재하는 모든 데이터가 출력됩니다.
    이때, 토픽에 존재하는 데이터(레코드)의 key가 동일해도 key의 중복을 허용하며 데이터를 모두 가져옵니다.
  • KTable
    KTable로 데이터를 조회하면 토픽에 존재하는 데이터를 가져오면서 현재 가져온 데이터의 key가 이전에 가져온 데이터의 key와 동일한 경우에는 현재 가져온 데이터(최신 데이터)로 해당 key의 value를 변경(덮어씌움)합니다.
  • GlobalKTable
    TODO: 핵심키워드 Co-partitioning, TopologyException, Join...

- 스트림즈 DSL 구현해보기

Kafka 스트림즈 구현하기를 참고하세요.

(2) 프로세서 API

- 프로세서 API의 특징

프로세서 API는 앞서 사용하였던 스트림즈DSL에 존재했던 데이터 흐름 추상화 개념인 KStream, KTable, GlobalKTable을 사용하지 않습니다.
프로세서 API는 스트림즈 DSL에서 제공하는 다양한 메서드보다 추가적인 작업이 필요할 때 활용하기 좋습니다.

- 프로세서 API 구현해보기

Kafka 스트림즈 구현하기를 참고하세요.




이번 포스팅에서는 스트림즈에 대해서 알아보고, 스트림즈를 구현하는 스트림즈 DSL, 프로세서 API에 대해 알아보고 간단한 예제를 만들어서 진행해보았습니다.
스트림즈를 구현하는 2가지 프로세스는 결국 어떻게 구현을 하던지 간에 Source > Stream > Sink의 처리 순서를 기반으로 만든다는 것을 이해한다면 스트림즈의 구현이 조금은 수월할 것 같습니다.

해당 글 작성에 참고한 링크

[도서] 아파치 카프카 애플리케이션 프로그래밍 with 자바
https://ooeunz.tistory.com/137

profile
망한 개발자의 개발 기록입니다. 저를 타산지석으로 삼으시고 공부하세요.

0개의 댓글