카프카 스트림즈 애플리케이션

카프카 스트림즈는 카프카 컨슈머를 사용해서 데이터를 처리하는 것보다 더 안전하고 빠르면서도 다양한 기능을 사용할 수 있는 기술로, 카프카에서 공식적으로 제공하는 자바 라이브러리로 토픽에 있는 데이터를 낮은 지연과 함께 빠른 속도로 데이터를 처리할 수 있음

라이브러리로 제공되기 때문에 자바나 스칼라, 코틀린과 같은 JVM기반 언어 중 하나를 선택해 개발 가능

스프링부트에 올려도 되고 순수 자바 애플리케이션에 라이브러리를 추가시켜서 동작하게 배포할 수 있음

카프카 스트림즈의 4가지 장점

01. 카프카와 완벽 호환

  • 카프카를 이벤트 저장소로 사용하고 저장된 데이터를 스파크 또는 로그스태시와 같은 툴로 연동하는 경우가 많은데, 이러한 외부 오픈소스 툴의 문제는 빠르게 발전하는 오픈소스 카프카의 버전에 따라오지 못함
  • 반면 스트림즈는 매번 카프카가 릴리즈 될 때마다 카프카 클러스터와 완벽하게 호환되면서 최신의 기능들을 가지고 있음
  • 따라서, 카프카의 보안 기능이나 ACL같은 것들이 붙어 있더라도 완벽하게 호환되어 처리할 수 있고 성능개선도 빠르게 이루어지고 있음
  • 무엇보다도 유실이나 중복처리되지 않고 딱 한 번만 처리될 수 있는 강력한 기능을 가지고 있는데, 카프카와 연동하는 이벤트 프로세싱 도구 중에 거의 유일하다고 볼 수 있음

02. 스케쥴링 도구 불필요

  • 카프카와 연동하는 스트림 프로세싱 툴로 가장 많이 그리고 널리 사용하는 것이 스파크 스트림일텐데, 스파크 스트리밍 또는 스파크 구조적 스트림을 사용하면 카프카와 연동하여 마이크로 배치처리를 하는 이벤트 데이터 애플리케이션을 만들 수 있음
  • 여기서 문제는 스파크를 운영하기 위해 yarn이나 mesos와 같이 클러스터 관리자 또는 리소스 매니저 같은 것이 필요하고, 클러스터를 운영하기 위해 대규모 장비들고 구축해야 함
  • 반면 스트림즈를 사용하면 스케쥴링 도구는 전혀 필요가 없음
  • 스트림즈 애플리케이션은 컨슈머 애플리케이션이나 WAS애플리케이션을 배포하는 것처럼 원하는 만큼 배포하면 됨
  • 만약 적은 양의 데이터를 처리해야 한다면 2개 정도의 스트림즈 애플리케이션을 운영하면 되고, 많이 처리해야 한다면 자연스럽게 스케일 아웃해서 더욱 많은 애플리케이션을 배포하면 됨

03. 스트림즈DSL과 프로세서API 제공

  • 스트림즈를 구현하는 방법은 스트림즈DSL과 프로세서API 두가지로, 대부분의 경우 스트림즈DSL을 사용해서 해결할 수 있음
  • 스트림즈 DSL은 이벤트 기반 데이터 처리를 할 때 필요한 다양한 기능들인 map, join, window와 같은 메서드들을 제공하기 때문에 편리하게 사용 가능하며, 스트림즈DSL에 없는 기능이 있다면 프로세서API를 사용해서 로직을 작성하면 됨
  • 그리고 스트림즈DSL만이 제공하는 KStream, KTable, GlobalKTable은 독특한 스트림 처리 개념으로 카프카를 스트림 데이터 처리 뿐만 아니라 대규모 key-value 저장소로도 사용할 수 있음

04. 로컬 상태저장소 사용

  • 실시간으로 들어오는 데이터를 처리하는 방식은 크게 비상태기반 처리와 상태기반처리 두 가지 방식이 있음
  • Stateless라고도 불리는 비상태기반 처리는 필터링이나 데이터를 변환하는 처리로, 데이터가 들어오자마자 바로 처리하고 프로듀스하면 되기 때문에 유실이나 중복이 발생할 염려가 적고 쉽게 개발 가능
  • 반면 Stateful이라고 불리는 상태기반 처리를 직접 구현하려면 window, join, aggregation과 같은 처리를 해야 하는데, 이는 이전에 받았던 데이터를 프로세스가 메모리에 저장하고 있으면서 다음 데이터를 참조해서 처리해야 하기 때문에 상태기반 분산 프로세스를 구현하는 것은 매우 어려움
  • 스트림즈는 이러한 어려운 처리를 돕기 위해 로컬에 rocksdb를 사용해서 상태를 저장하고, 이 상태에 대한 변환 정보는 카프카의 변경로그(changelog) 토픽에 저장
  • 따라서, 스트림즈를 사용하면 프로세스에 장애가 발생하더라도 그 상태가 모두 안전하게 저장되기 때문에 자연스럽게 복구가 될 수 있음

카프카 스트림즈 코드 예시

Untitled

위 코드는 payment 토픽에 메시지 키가 “unknown”인 데이터를 필터링해서 unknown-payment 토픽으로 보내는 스트림즈 코드

스트림즈 DSL이 제공하는 이벤트기반 메서드를 사용하면 기존 컨슈머로 폴링하거나, 프로듀서를 구현할 필요 없이 쉽게 구현가능


참고 강의 : https://www.inflearn.com/course/아파치-카프카-입문/dashboard