Punctuator Kafka Streams에서는 Punctuator를 이용해서 레코드의 downstream 전달 시점을 제어할 수 있다. punctuator는 Commit() / Flush()와는 별개로 동작하고, 이 녀석들을 사용하지 않고도 레코드의 downstream 전달 시점을 제어할 수 있다. punctuator는 각 StreamTask가 가지고 있는 ProcessorContext의 schedule() 메서드를 호출해서 예약할 수 있다. 일단 예약되면, Stream Thread의 process() 처리 이후에 punctuator를 호출해서 레코드에 대한 일정 부분의 작업을 할 수 있다. Punctuator의 설정 PunctuationType.WALL_CLOCK_TIME : WALL_CLOCK_T..
StandBy Task Kafka Streams의 Task들은 토폴로지를 시작하기 전에 StateStore를 복구한다. Stream Thread의 모든 Task들의 StateStore가 복구된 이후 Topology가 실행된다. 이런 이유 때문에 StateStore의 복구 시간이 중요할 수 있다. StateStore의 복구 시간을 단축하는데 도움이 되는 것이 Standby Task다. StandbyTask는 Stream Task가 죽었을 때 빠르게 복구할 수 있도록 항상 스탠바이 하도록 노력해주는 Task다. 예를 들어 Task1에 대해서 StandbyTask가 존재한다면, Task1이 죽었을 때 StandbyTask가 어느정도 생성해 둔 StateStore를 사용해서 복구 작업을 보다 빠르게 할 수 있다..
State의 복구와 ChangeLog Kafka Streams는 집계 등이 필요한 경우에는 StateStore를 이용해서 상태를 기억하는 작업을 한다. StateStore는 In-Memory 혹은 Local 스토리지에 기록되는데 공통적인 부분은 서버가 죽었을 때, 모두 휘발된다는 점이다. Kafka Streams는 이 부분을 해결하기 위해 StateStore를 기록하는 ChangeLog 토픽을 Kafka Broker에 생성하는 작업을 한다. 그리고 StateStore의 변경점을 ChangeLog에 저장하고, 서버가 불시에 죽고 재기동될 때 ChangeLog 토픽에서 값을 읽어와서 StateStore를 복구하는 작업을 한다. ChangeLog에서 State는 어떤 경로로 불러와지는가? 각 노드의 State..
CheckPoint Kafka Streams가 시작되면, Kafka Streams는 GlobalStreamThread / StreamThread의 StateStore를 초기화한다. StateStore를 초기화 할 때 체크 포인트 파일이 존재하는지를 확인한다. 체크 포인트 파일은 StateStore에 플러쉬되고 change-log 토픽에 쓰여진 가장 최신의 레코드에 대한 Offset을 저장하고 있다. 따라서 Kafka Streams가 시작할 때 체크 포인트 파일이 존재하고, 특정 change log 토픽의 파티션에 대한 체크포인트가 존재한다면 StateStore는 체크포인트 파일에 존재하는 오프셋으로 설정되게 된다. 만약 체크포인트 파일이 존재하지 않으면 복구는 가장 처음 오프셋부터 시작된다. CheckP..
GlobalKTable vs KTable GlobalKTable은 Kafka Streams DSL에서 지원하는 KTable이다. 일반적으로 제공되는 KTable과는 다음 차이가 존재한다. KTable은 해당 노드에 할당된 파티션의 데이터만 읽어와서 StateStore에 보관한다. GlobalKTable은 모든 파티션의 데이터를 읽어와서 StateStore에 보관한다. 이런 특징 때문에 GlobalKTable은 파티셔닝에 대한 신경을 쓰지 않아도 된다는 장점이 있다. 반면, 카프카 스트림즈의 모든 클러스터는 각각 토픽의 전체 파티션을 모두 읽어와서 각 노드에 각각의 StateStore를 가지고 있게 된다. GlobalKTable은 읽어온 Table을 Local 스토리지를 이용해서 StateStore에 보관..