-
카프카 스트림즈
- 토픽에 적재된 데이터를 상태기반 또는 비상태기반으로 실시간 변환하여 다른 토픽에 적재하는 라이브러리
- 카프카에서 공식 지원하는 라이브러리, 완벽하게 호환. 편리한 기능 제공
- 장애가 발생하더라도 정확히 한번 처리할 수 있도록 장애허용시스템을 제공
- JVM에서 하나의 프로세스로 실행되기 때문에 분산시스템이나 스케줄링 불필요
- 내부적으로 스레드 1개이상 생성가능. 스레드는 1개 이상의 태스크를 가짐
- 태스크: 스트림즈 애플리케이션을 실행하면 생기는 데이터 처리 최소 단위
- 토폴로지: 2개 이상의 노드들과 선으로 이루어진 집합
- ring, tree, star 등이 있는데 스트림즈에서는 tree 형태의 토폴로지와 유사
- 프로세서: 토폴로지를 이루는 노드 각각
- 소스 프로세서: 데이터를 처리하기 위해 최초로 선언해야하는 노드. 하나 이상의 토픽에서 데이터를 가져오는 역할.
- 스트림 프로세서: 다른 프로세서가 반환한 데이터를 처리하는 역할.
- 싱크 프로세서: 테이터를 특정 카프카 토픽으로 지정하는 역할. 스트림즈로 처리된 데이터의 최종 정착지.
- 스트림: 노드를 이은 선
- 스트림즈DSL, 프로세서API
- 스트림즈DSL
- KStream, KTable, GlobalKTable: 레코드를 추상화한 3가지 개념으로 스트림즈DSL에서만 사용되는 개념
- KStream
- 레코드의 흐름을 표현한 것
- message key, message value로 구성
- 토픽에 존재하는 (KStream에 존재하는) 모든 레코드가 출력
- 컨슈머로 토픽을 구독하는 것과 동일선상이라고 보면 됨
- KTable
- 메시지 키를 기준으로 묶어 사용
- 메시지 키를 기준으로 가장 최신 레코드를 사용(출력됨)
- 동일한 키의 메시지가 추가되었을 경우 업데이트 되었다고 볼 수 있음
- GlobalKTable
- KTable과 동일하게 메시지 키를 기준으로 묶어 사용
- KTable로 선언된 토픽은 1개의 파티션이 1개의 태스크 할당
- GlobalKTable로 선언된 토픽은 모든 파티션 데이터가 각 태스크에 할당되어 사용
- join을 수행할 때
- KStream, KTable을 조인하려면 코파티셔닝(co-partitioning) 되어 있어야 함
- 코파티셔닝: 2개 데이터의 파티션 개수가 동일하고 파티셔닝 전략을 동일하게 맞추는 작업
- 파티션 개수가 동일하고 전략이 같을 경우, 동일한 메시지 키를 가진 데이터가 동일한 태스크에 들어가는 것을 보장
- 각 태스크는 KStream의 레코드와 KTable의 메세지 키가 동일한 경우 조인 가능(아닐 경우 TopologyException으로 조인이 되지 않음)
- 코파티셔닝이 되어 있지 않으면 리파티셔닝(repartitioning: 새로운 토픽에 새로운 메시지 키를 가지도록 재배열하는 과정)으로 코파티셔닝되도록 할 수 있음
- 코파이셔닝 되어 있지 않은 것을 조인하고 싶다면? GlobalKTable로 선언하여 사용하면 됨
- GlobalKTable로 정의된 데이터는 스트림즈 애플리케이션의 모든 태스크에 동일하게 공유되어 사용됨
- 하지만, 로컬 스토리지의 사용량이 증가하고 네트워크, 브로커에 부하가 생김 (작은 용량의 데이터일 경우에만 사용하는 것이 좋음)
- 많은 양의 데이터는 리파티셔닝을 통해 KTable을 권장
- 필수옵션
- bootstrap.servers
- application.id
- stream(): stream(), table(), globalTable()은 최초의 토픽 데이터를 가져오는 소스 프로세서
- to(): KStream 인스턴스의 데이터들을 특정 토픽으로 저장하기 위한 용도. 싱크 프로세서
- filter(): 필터링 스트림 프로세서
- GlobalKTrable과 KStream을 join
- GlobalKTable로 선언한 토픽은 토픽에 존재하는 모든 데이터를 태스크마다 저장하고 조인처리를 수행
- 조인을 수행할 때, key 뿐만 아니라 value 값을 기준으로도 매칭하여 조인 가능
- 프로세서 API
- 토폴로지를 기준으로 데이터를 처리한다는 관점이 동일
- KStream, KTable, GlobalKTable 등의 개념이 없음
- 직접 구현하여 사용한다