들어가기 전 이번 포스팅에서는 Kafka Streams에서 Session Window를 이용해서 집계를 했을 때, 실제 집계 동작이 어떻게 이루어지는지를 오픈소스 코드를 뜯어보며 이해하고자 한다. 알아두면 좋은 것 Session Window는 새로 들어온 메세지들에 대해서 비활성 시간을 바탕으로 같은 세션 윈도우에 묶일 수 있는지를 확인한다. 이 때 사용되는 개념은 In-activate Time과 Grace Period Time이다. 아래 그림에서는 실제 코드를 두 가지 경우로 나눠서 확인해보고자 한다. Record가 도착하면 Window StateStore에서 현재 Record Timestamp를 기준으로 In-activate Time 간격 내에서 조회되는 모든 Session Window를 가져온다. ..
들어가기 전 Kafka Streams에서 스트림의 레코드 처리는 하나의 레코드씩 깊이 우선으로 처리를 하고 있다. 생성된 Topology가 다양한 형태로 되어있다고 하더라도 하나의 레코드를 기준으로 깊이 우선으로 처리를 한 후에 다음 레코드를 처리하는 형태다. 이번 포스팅에서는 간단한 Join 메서드를 이용해서 Topology를 구현하고, 해당 Topology에서 실제 구현은 어떻게 되는지를 살펴보고자 한다. 각 스트림의 Join 실행 방식 왼쪽 그림처럼 Topology를 생성하고 스트림 프로세스를 시작한다고 가정해보자. 오른쪽 그림은 Topology를 만족하기 위해서 실제로 생성되는 Stream들을 의미한다. 실제로는 각각의 Stream으로 나누어져서 동작하는 구조를 가진다. 그리고 서두에서 이야기한 ..
이 글은 Kafka Streams In Action 5장을 공부하고 정리한 글입니다. 들어가기 전 Stream은 끊임없는 이벤트의 흐름이다. Table은 어떤 처리(집계)등을 통해서 현재 상태를 보여주는 역할을 한다. Table은 Stream과는 꽤 다른 방식으로 동작하기도 하지만, Stream과 Join하면서 Stream에 또 다른 문맥을 추가해주는 역할을 할 수 있다. 때로는 Table은 Stream으로 바뀌어서 최신 데이터들만 Stream 하는 녀석도 될 수 있다. 5.1 스트림과 테이블의 관계 스트림은 연속적인 이벤트의 흐름이고, 테이블은 연속적인 이벤트들의 현재 상태를 나타낸다. 아래에서 좀 더 자세히 살펴보고자 한다. 5.1.1 레코드 스트림과 DB의 테이블 예를 들어 위와 같이 주가에 대한 ..
들어가기 전 이 글은 Kafka Streams에서 Aggregate의 동작 방식을 코드를 보고 정리한 글입니다. 정리 Aggregate() 메서드를 이용하게 되면 Init, Add, Remove 함수를 각각 선언해줘야한다. 여기서 궁금한 점은 Init, Add, Remove 함수는 각각 언제 호출되느냐이다. 정리하면 다음과 같다. 레코드의 Key로 StateStore에서 값을 찾아왔을 때 없다면 Init Value가 호출된다. 레코드의 Key로 StateStore에서 값을 찾아왔을 때 존재한다면, Aggreagator의 Remove 메서드를 호출한다. 도착한 레코드에 새로운 값이 존재한다면, Aggregator의 Add 메서드를 호출한다. Aggregator 클래스에서 전체적으로 메서드가 호출되는 순서는..
들어가기 전 이번 포스팅에서는 Kafka Streams에서 제공하는 Tumbling Window / Hopping Window가 실제로 어떻게 동작하는지 코드 단위로 확인해보고자 한다. 알아둬야 할 부분 Tumbling Window와 Hopping Window는 TimeWindow를 바탕으로 동작한다. TimeWindow는 고정된 기간이 있는 것을 의미한다. Tumbling Window는 고정된 기간이 끝나면 새로운 Window를 생성해서 집계하는 동작을 하고, Hopping Window는 TimeWindow에 설정된 기간동안 집계는 하되 advanceMs에 설정된 기간동안 새로운 TimeWindow를 만들어서 좀 더 자주 집계하는 동작을 한다. TimeWindow를 구할 때 가장 먼저 Window Cl..