이 글은 코드를 따라가보면서 뇌피셜로 작성한 글이기 때문에 틀릴 수도 있습니다. 틀릴 경우 댓글을 남겨주시면 수정하겠습니다. StateStore StateStore는 StreamTask별로 고유하게 주어진다. 그리고 StreamTask는 고유한 파티션을 가진다. 따라서 StateStore는 고유한 파티션에 대응되는 상태 저장소라고 볼 수 있다. 또한 StateStore는 이름으로 관리되는데, 동일한 이름을 가진 StateStore를 사용할 수 없기 때문에 각 StreamTask가 가지고 있는 노드끼리는 StateStore를 공유할 수 없는 것으로 보인다. StreamTask의 StateStore 관리 StreamTask는 내부적으로 stateDirectory라는 필드를 가지고 있다. 이 stateDire..
들어가기 전 Kafka Streams에서는 특정 TopicPartition은 하나의 StreamTask에게 할당된다. StreamTask는 본인에게 할당된 TopicPartition만 가지고 작업을 하기 때문에 데이터는 격리된다. 따라서 StreamTask의 데이터 격리성 때문에 동시성 문제를 걱정할 필요는 없다. 그렇다면 StreamTask는 어떻게 만들어질까? StreamTask 생성방식 StreamTask가 생성되는 과정을 살펴보면 다음과 같다. Consumer가 현재 구독하고 있는 TopicPartition 정보를 Broker에게서 받아온다. 받아온 TopicPartition 정보를 ConsumerCoordinator에게 전달한다. ConsumerCoordinator는 전달받은 TopicParti..
Kafka Stream의 전체 흐름 Kafka Streams는 전체적으로 다음 순서대로 동작한다. poll : KafkaConsumer를 이용해 Broker에서 메세지를 가져옴. process : 가져온 메세지를 처리함. commit : 처리 완료한 후, Broker에게 처리 완료 Commit함. 이번 포스팅에서는 poll을 했을 때 어떻게 데이터를 가져오고, 이 데이터는 어디에 저장되어 Process를 할 수 있게 되는지를 살펴보고자 한다. Kafka Streams가 토픽에서 메세지를 가져오는 방법 위의 과정이 Kafka Streams가 토픽에서 메세지를 가져오는 방법이다. 간략히 정리하면 다음과 같다. KafkaStreams Server는 메세지를 가져올 것을 Stream Thread에게 명령한다. ..
이 글은 Kafka Streams In Action을 공부하며 작성한 글입니다. 들어가기 전 이전 장에서는 토폴로지를 만들었지만, 스트림에서 변환과 작업이 전혀 없는 상태였다. 스트림마다 개별 트랜잭션으로 생각했었고, 각 트랜잭션을 Join해서 데이터를 더 풍부하게 만들 생각을 하지 못했다. 이번 포스팅에서는 State(상태)라는 것을 이용하려고 한다. 또한 Join을 이용해서 데이터를 더 풍부하게 만드는 부분도 접근하고자 한다. 4.1 이벤트와 스트림 이벤트 카프카에서 이벤트는 끊임없이 발생하는 메세지와 동일하다. 주식을 예로 들면 다음과 같다. 10:00 : A 사의 주식을 10000주 구매 10:10 : A 사의 주식을 1000주 구매 10:20 : A 사의 주식을 100주 구매 다음과 같이 시간에..
들어가기 전 ksqlDB는 Kafka Streams 위에 구현되어있다. 따라서 ksqlDB의 동작 과정을 low한 레벨로 공부하고 싶다면 Kafka Streams를 공부해야한다. 여기서는 ksqlDB에서 이야기 하는 ksqlDB Server / ksqlDB Client 구조를 살펴보고자 한다. ksqlDB Server 클러스터 ksqlDB는 클러스터 단위로 구성될 수 있다. ksqlDB Cluster마다 고유한 ksql.service.id를 가진다. 같은 ksql.service.id만이 같은 Context를 가지고 부하를 분산할 수 있고, 서로 다른 ksql.service.id를 가지는 클러스터끼리는 격리되어있다. 같은 ksql.service.id를 가지는 것은 같은 consumer group의 멤버인 ..