Kafka

[Kafka] 아파치 카프카 스트림즈란? (Apache Kafka Streams)

15호의 개발자 2022. 2. 21. 16:06
반응형

[Kafka] 아파치 카프카 스트림즈란? (Apache Kafka Streams)

 

 

아파치 카프카 스트림즈

카프카는 분산 이벤트 스트리밍 플랫폼으로써, 프로듀서와 컨슈머를 사용해서 데이터를 보내고 가져와서 처리할 수 있다. 수많은 국내외 기업에서 카프카를 사용하고 있으며, 자바/고랭/파이썬과 같은 언어들을 사용해서 프로듀서와 컨슈머를 개발하고 있다. 
하지만 컨슈머를 사용해서 데이터를 처리하는 것보다 더 안전하고 빠르면서도 다양한 기술을 사용할 수 있는 것이 있다. 바로 '카프카 스트림즈Kafka Streams'이다.

 

카프카 스트림즈는 카프카에서 공식적으로 제공하는 자바 라이브러리로써, 토픽에 있는 데이터를 낮은 지연과 빠른 속도로 처리할 수 있다. 스트림즈는 라이브러리로 제공되는 것이므로, 자바/스칼라/코틀린과 같은 JVM 기반의 언어 중 하나를 선택해서 개발하면 된다. 또한 스프링부트 위에 올려도 되며, 순수 자바 애플리케이션에 라이브러리를 추가시켜서 동작하게 배포할 수도 있다. 

 

 

아파치 카프카 스트림즈의 장점


장점

  1. 카프카와 완벽 호환된다.
    - 대부분의 기업은 카프카를 이벤트 저장소로 사용하고 저장된 데이터를 spark(스파크) 또는 logstash(로그스태시)와 같은 툴로 연동할 것이다. 이런 외부 오픈소스툴의 문제점은 빠르게 발전하는 오픈소스 카프카의 버전을 따라가지 못한다는 것이다. 하지만 kafka streams는 카프카가 새롭게 릴리즈 될 때마다 카프카 클러스터와 완벽하게 호환되는 최신의 기능들을 갖는다. 따라서 카프카에 보안 기능이나 ACL 같은 것들이 붙어 있더라도 완벽하게 호환 가능하며, 성능 개선도 빠르게 이루어지고 있다. 무엇보다도 데이터가 유실되거나 중복 처리되지 않고 딱 한 번만 처리될 수 있는 강력한 기능을 가지고 있다. 이는 카프카와 연동하는 이벤트 프로세싱 도구 중에 거의 유일하다고 볼 수 있다. 따라서 카프카를 사용하고 있고 데이터를 안전하고 빠르게 처리하고 싶다면 apache kafka streams를 1순위로 고려해야 한다.
  2. 스케줄링 도구가 필요 없다.
    - 카프카와 연동하는 스트림 프로세싱 툴로써 가장 많이 그리고 가장 널리 사용하는 것이 spark stream(스파크 스트림)일 것이다. 스파크 스트리밍 또는 스파크 구조적 스트림을 사용하면, 카프카와 연동하여 마이크로 배치 처리를 하는 이벤트 데이터 애플리케이션을 만들 수 있다. 하지만 문제는 스파크를 운영하기 위해서는 yarn이나 mesos와 같은 클러스터 관리자나 리소스 매니저 같은 것들이 필요하다는 점이다. 그리고 클러스터를 운영하기 위해 대규모 장비들도 구축해야 한다. 반면 스트림즈를 이용하면 스케줄링 도구는 전혀 필요가 없다. 개발한 스트림즈 애플리케이션은 컨슈머 애플리케이션이나 WAS 애플리케이션을 배포하는 것처럼 원하는 만큼 배포하면 된다. 만약 적은 양의 데이터를 처리해야 한다면 2개 정도의 스트림즈 애플리케이션을 띄워서 운영하면 되고, 데이터를 많이 처리해야 한다면 자연스럽게 scale out해서 10개 내지 20개의 애플리케이션을 배포하면 된다.
  3. 스트림즈 DSL과 프로세서 API를 제공
    스트림즈를 구현하는 방법은 크게 두 가지가 있다. 
    1. 대부분의 경우는 스트림즈 DSL을 사용해서 구현할 수 있다. 스트림즈 DSL은 이벤트 기반 데이터 처리를 할 때 필요한 다양한 기능들을 map, join, window와 같은 메서드를 통해 제공하기 때문에 사용하기 편하다.
    2. 스트림즈 DSL에서 없는 기능이라면, 프로세서 API를 이용해서 로직을 작성하면 된다. 다만, 대부분의 기능이 이미 스트림즈 DSL에 있으므로 아직까지는 프로세서 API를 사용할 필요가 없을 것이다. 그만큼 스트림즈 DSL은 강력한 기능을 내포하고 있다.

      또한 스트림즈 DSL에서 제공하는 KStream, KTable, GlobalKTable은 그 어디서도 볼 수 없는 독특한 스트림 처리 개념이다. 카프카를 스트림 데이터 처리뿐만 아니라 대규모 key-value 저장소로 사용할 수 있는 기능이다. 따라서 카프카를 더 풍부한 기능으로 사용하고 싶다면 카프카 스트림즈는 필수이다.
  4. 로컬 상태저장소를 사용한다.
    실시간으로 들어오는 데이터를 처리하는 방식은 크게 두 가지가 있다.
    1. 비상태 기반 처리 (Stateless)
      필터링이나 데이터를 변환하는 처리이다. 데이터가 들어오는 족족 바로 처리하고 프로듀스하면 되기 때문에 데이터 유실이나 중복이 발생할 확률이 적으며, 쉽게 개발할 수 있다. 
    2. 상태 기반 처리 (Stateful)
      상태 기반 처리를 직접 구현하는 것은 상당히 어렵다. 왜냐하면 window, join, aggregation(취합)과 같은 처리는 이전에 받았던 데이터를 프로세스가 메모리에 저장하고 있으면서 다음 데이터를 참조해서 처리해야 하기 때문이다. 이처럼 상태 기반 분산 프로세스를 구현하는 것은 매우 허들이 높은데, 이런 어려움을 극복해주는 것이 스트림즈이다. 스트림즈는 로컬의 rocksdb를 사용해서 상태를 저장하고, 이 상태에 대한 변환 정보는 카프카의 변경로그(changelog) 토픽에 저장한다. 따라서 스트림즈를 사용하면 프로세스에 장애가 발생하더라도 그 상태가 안전하게 저장되기 때문에 자연스럽게 장애 복구가 될 수 있다. 엄청나게 강력한 기능이다.

 

 

 

 

Streams 코드 예시

 

KStream<String, String> paymentStream = builder.stream("payment");
KStream<String, String> filteredStream = paymentStream.filter((key, value) -> key.equals("unknown"));
filteredStream.to("unknown-payment");

위 코드는 payment 토픽에 메시지 키가 unknown인 데이터를 필터링해서 unknown-payment 토픽으로 보내는 스트림즈 코드이다. 기존처럼 컨슈머로 폴링하거나 프로듀서를 어렵게 구현할 필요가 없으므로 매우 쉽다.

 

카프카 스트림즈는 이벤트 기반 처리에 있어서 아직 국내에서는 익숙하지 않은 기술이지만, 실시간으로 끊임없이 발생하는 데이터를 처리해야 할 때 어떤 프레임워크로 처리해야할지 고민이라면, 카프카 스트림즈에 대해 공부한 후 도입 여부를 고려하는 것이 좋을 것이다.

 

 

 

 

(출처: 유튜브 데브원영 DVWY)

반응형