Kafka Streams API

Kafka Streams API

Stream Processing

스트림 프로세싱이란, 데이터들이 지속적으로 유입되고 나가는 과정에서 데이터에 대한 분석이나 질의를 수행하는 것 을 의미한다. 즉, 스트림 프로세싱은 데이터가 이동 중이거나 생성되어 수신되는 즉시 처리하기 때문에 실시간 분석이라고도 불린다.

스트림 프로세싱을 사용하기 전

스트림 프로세싱을 사용하기 전에는 위와 같이 주로 데이터를 데이터베이스나 파일 시스템과 같은 대용량 저장소에 저장한 후, 필요에 따라 Application이 쿼리를 수행하거나 분석을 하는 등 배치 처리의 형태를 띄고 있었다.

하지만 빅데이터 붐이 일어나고 스트림 프로세싱이 등장하고부터 이러한 데이터 처리 패러다임이 바뀌었다. 기존의 배치 형태를 띠고 있던 데이터 처리 파이프라인이 실시간으로 지속적으로 데이터를 처리하고 분석하게 되었다. 배치를 아예 사용하지 않는 것은 아니지만, 스트림 처리 시스템과 배치 처리 시스템을 모두 갖추어 실시간과 정확성을 모두 높이는 형태로 발전되었다고 할 수 있다.

스트림 프로세싱에서는 스트림에서 이벤트가 발생하면 스트림 프로세싱 Application이 즉각적으로 로그 이벤트에 반응하게 되고, 해당 데이터를 통계 내거나 나중에 사용하기 위해 저장하는 등 다양한 형태로 이벤트를 처리하게 된다.

이와 같이 스트림 프로세싱은 실시간으로 데이터를 분석하고 이벤트 중심으로 데이터를 처리하기 때문에 오늘날 개발자가 빅데이터 처리에 신경써야 할 많은 부분들을 손쉽게 해결해줄 수 있다.

장점

스트림 프로세싱은 Application과 분석이 즉각적으로 반응한다. Event Happen → Analytics → Action의 과정에 지연이 거의 없으며, 분석과 액션은 항상 의미 있는 데이터를 반영한다. 스트림 프로세싱은 데이터를 저장한 후에 분석하는 것이 아니기 때문에 일반적으로 다른 정적 데이터 프로세싱 시스템보다 더 큰 데이터 용량을 다룰 수 있다. 스트림 프로세싱은 모든 데이터를 주기적으로 계산하는 배치와 정적 데이터 분석과 대조적으로 지속적으로 들어오는 데이터를 점차적으로 분석하기 때문에 실시간 처리에 최적화 되어있다. 스트림 프로세싱은 Application 자신의 데이터와 상태를 유지하기 때문에 대규모 공유 데이터베이스에 대한 의존성을 줄일 수 있다. 이러한 방식은 MSA 방식에 친화적이다.

Stateful Stream

스트림을 처리하다 보면 이전 스트림을 처리한 결과를 참조해야 하는 경우가 있다. 이런 처리 방식을 상태 기반 처리라고 한다. 상태 기반 처리를 하기 위해서는 Application의 처리 결과를 저장할 상태 저장소(State Store)가 필요하다. 이때 스트림 프로세싱 Application이 이 저장소를 관리하면 내부 상태 저장소라 하고, 데이터베이스와 같은 별도의 상태 저장소를 사용하게 되면 외부 상태 저장소라 한다.

이와 반대 무상태(Stateless) 스트림 프로세싱은 이전 스트림의 처리 결과와 관계없이 현재 Application에 도달한 스트림만을 기준으로 처리하는 것을 뜻한다.

Kafka Stream

위에서 알아본 스트림 처리를 위해 만들어진 것이 카프카 스트림즈이다. 카프카 스트림즈는 카프카에 저장된 데이터를 처리하고 분석하기 위해 개발된 클라이언트 라이브러리이다.

특징

간단하고 가벼운 클라이언트 라이브러리이기 때문에 기존 Java Application에서 쉽게 사용할 수 있다. 시스템이나 카프카에 대한 의존성이 없다. 이중화된 로컬 상태 저장소를 지원한다. 카프카 브로커나 클라이언트에 장애가 생기더라도 스트림에 대해선 한 번만 처리되는 것을 보장한다.

Stream Processing Topology

카프카 스트림즈는 스트림 처리를 하는 프로세스들이 서로 연결되어 토폴로지(Topology)를 만들어 처리하는 API이다. 따라서 일반 프로세스 노드에서 현재 레코드를 처리하는 동안 다른 원격 시스템에서도 접근할 수 있다. 이렇게 처리된 결과는 카프카로 다시 스트리밍 되거나 외부 시스템에 기록될 수 있다.

다음은 카프카 스트림 토폴로지에서 사용되는 용어이다.

Stream : 스트림은 카프카 스트림즈에서 제공하는 가장 중요한 추상화이다. 카프카 스트림즈 API를 사용해 생성된 토폴로지로 끊임없이 전달되는 데이터 세트를 의미한다. 스트림에 기록되는 단위는 Key-Value 형태를 띠고 있다.

Stream Processing Application : 카프카 스트림 클라이언트를 사용하는 Application으로, 하나 이상의 토폴로지를 처리하는 로직을 의미한다.

Stream Processor : 프로세서 토폴로지를 이루는 하나의 노드를 의미한다. 여기서 노드는 프로세서 형상에 의해 연결된 하나의 입력 스트림으로부터 데이터를 받아 변환한 다음, 다시 연결된 프로세서에 보내는 역할을 한다.

Source Processor : 소스 프로세서는 위쪽으로 연결된 프로세서가 없는 프로세서를 의미한다. 이는 하나 이상의 카프카 토픽에서 데이터 레코드를 읽어와 하위 프로세서에게 전달한다. Sink Processor : 해당 토폴로지 아래쪽에 프로세서가 없는 것을 의미한다. 이는 상위 프로세서로부터 받은 데이터 레코드를 카프카 특정 토픽에 저장한다.

Sink Processor : 해당 토폴로지 아래쪽에 프로세서가 없는 것을 뜻하며, 이는 상위 프로세서로부터 받은 데이터 레코드를 카프카 특정 토픽에 저장한다.

kafka Streams vs Consumer

컨슈머가 메시지를 받아 읽고 단순히 처리하여 끝내지만, 카프카 스트림즈는 메시지를 받아 연속된 처리를 위한 파이프라인을 구성할 수 있다. 예를 들어, 메시지의 민감 데이터를 마스킹한다거나 1분 간격으로 메시지의 특정 이벤트를 감지하는 등의 역할을 할 수 있다.

Reference

from http://havving-do-it.tistory.com/191 by ccl(A) rewrite - 2021-08-24 16:00:15