Kafka 카프카 스트림즈

2 minute read

Kafka Streams

카프카 스트림즈는 토픽에 적재된 데이터를 실시간으로 변환하여 다른 토픽에 적재하는 라이브러리이다. 스트림즈는 카프카에서 공식적으로 지원하는 라이브러리이다. 매번 카프카 버전이 오를 때마다 스트림즈 자바 라이브러리도 같이 릴리즈 된다. 그러기 때문에 자바 기반 스트림즈 애플리케이션은 카프카 클러스터와 완벽하게 호환되면서 스트림 처리에 피룡한 편리한 기능들을 제공한다.

스트림즈 애플리케이션 또는 카프카 브로커의 장애가 발생하더라도 정확히 한번(exactly once)할 수 있도록 장애 허용 시스템(fault tolerant system)을 가지고 있어서 데이터 처리 안정성이 매우 뛰어나다.

카프카 클러스터를 운영하면서 실시간 스트림 처리를 해야하는 필요성이 있다면 카프카 스트림즈 애플리케이션으로 개발하는 것을 1순위로 고려하는 것이 좋다.


프로듀서와 컨슈머를 조합하지 않고 스트림즈를 사용해야 하는 이유

스트림 데이터 처리에 있어 다양한 기능을 스트림즈DSL로 제공하며 필요하뎌면 프로세서 API를 사용하여 기능을 확장할 수 있기 때문이다. 물론 컨슈머와 프로듀서를 조합하여 스트림즈가 제공하는 기능과 유사하게 만들 수 있다. 그러나 스트림즈 라이브러리를 통해 제공하는 단 한 번의 데이터 처리, 장애 허용 시스템 등의 특징들을 컨슈머와 프로듀서의 조합만으로는 완벽하게 구현하기는 어렵다.

다만, 스트림즈가 제공하지 못하는 기능을 구현할 때는 컨슈머와 프로듀서를 조합하여 구현하면 좋다. 예를 들어, 소스 토픽(사용하는 토픽)과 싱크 토픽(저장하는 토픽)의 카프카 클러스터가 서로 다른 경우는 스트림즈가 지원하지 않으므로 이 때는 컨슈머와 프로듀서 조합으로 직접 클러스터를 지정하는 방식으로 개발할 수 있다.


스트림즈 내부 구조

스트림즈 애플리케이션은 내부적으로 스레드를 1개 이상 생성할 수 있으며, 스레드는 1개 이상의 태크스를 가진다. 스트림즈의 ‘태스크(task)’는 스트림즈 애플리케이션을 실행하면 생기는 데이터 처리 최소 단위이다.

만약 3개의 파티션으로 이루어진 토픽을 처리하는 스트림즈 애플리케이션을 실행하면 내부에 3개의 태스크가 생긴다. 컨슈머의 병렬처리를 위해 컨슈머 그룹으로 이루어진 컨슈머 스레드를 여러개 실행하는 것과 비슷하다고 볼 수 있다. 카프카 스트림즈는 컨슈머 스레드를 늘리는 방법과 동일하게 병렬처리를 위해 파티션과 스트림즈 스레드(또는 프로세스) 갯수를 늘림으로써 처리량을 늘릴 수 있다.


스트림즈 애플리케이션 스케일 아웃

실제 운영환경에서는 장애가 발생하더라도 안정적으로 운영할 수 있도록 2개 이상의 서버로 구성하여 스트림즈 애플리케이션을 운영한다. 이를 통해 일부 스트림즈 애플리케이션 또는 애플리케이션이 실행되는 서버에 장애가 발생하더라도 안전하게 스트림 처리를 할 수 있다.


토폴로지

카프카 스트림즈의 구조와 사용 방법을 알기 위해서는 토폴로지(topology)와 관련된 개념을 익혀야 한다. 토폴로지란 2개 이상의 노드들과 선으로 이루어진 집합을 뜻한다. 토폴로지의 종류로는 링형(ring), 트리형(tree), 성형(star)등이 있는데 스트림즈에서 사용하는 토폴로지는 트리 형태와 유사하다.

카프카 스트림즈에서는 토폴로지를 이루는 노드를 하나의 ‘프로세서’라고 부르고 노드와 노드를 이은 선을 ‘스트림’이라고 부른다. 스트림은 토픽의 데이터를 뜻하는 데 프로듀서와 컨슈머에서 활용했던 레코드와 동일하다.


소스 프로세서, 스트림 프로세서, 싱크 프로세서

프로세서는 소스 프로세서, 스트림 프로세서, 싱크 프로세서 3가지가 있다.

  • 소스 프로세서
    • 소스 프로세서는 데이터를 처리하기 위해 최초로 선언해야 하는 노느로, 하나 이상의 토픽에서 데이터를 가져오는 역할을 한다.
  • 스트림 프로세서
    • 스트림 프로세서는 다른 프로세서가 반환한 데이터를 처리하는 역할을 한다. 변환, 분기처리와 같은 로직이 데이터 처리의 일종이라고 볼 수 있다.
  • 싱크 프로세서
    • 싱크 프로세서는 데이터를 특정 카프카 토픽으로 저장하는 역할을 하며 스트림즈로 처리된 데이터의 최종 종착지이다.

스트림즈DSL과 프로세서API

스트림즈DSL(Domain Specific Language)과 프로세서 API 2가지 방법으로 개발 가능하다. 스트림즈 DSL은 스트림 프로세싱에 쓰일 만한 다양한 기능등을 자체 API로 만들어 놓았기 때문에 대부분의 변호나 로직을 어렵지 않게 개발할 수 있다.

만약 스트림즈DSL에서 제공하지 않는 일부 기능들의 경우 프로세서 API를 사용하여 구현할 수 있다. 스트림즈DSL과 프로세서 API가 구현할 수 있는 종류는 다음과 같다.

  • 스트림즈DSL로 구현하는 데이터 처리 예시
    • 메세지 값을 기반으로 토픽 분기 처리
    • 지난 10분간 들어온 데이터의 갯수 집계
  • 프로세서API로 구현하는 데이터 처리 예시
    • 메세지 값의 종류에 따라 토픽을 가변적으로 전송
    • 일정한 시간 간격으로 데이터 처리
-->

Categories:

Updated:

Comments