본문 바로가기

빅데이터/Kafka

토픽을 GlobalKTable 구체화된 뷰(view) 키-값 저장소로 사용시 특이점 및 주의사항

https://blog.voidmainvoid.net/442

 

카프카 스트림즈 KTable로 선언한 토픽을 key-value 테이블로 사용하기

카프카 스트림즈의 KTable은 토픽의 데이터를 key-value형태로 사용할 수 있도록 구체화된 뷰(Materialized View)를 제공합니다. 구현방법은 다음과 같습니다. 0. 카프카 스트림즈 디펜던시 추가 dependencies

blog.voidmainvoid.net

토픽의 데이터를 키-값 저장소로 사용하여 데이터를 조회할 수 있는 방법을 앞서 다루어 보았습니다. 아래는 응용하여 만든 GlobalKTable의 뷰 입니다.

StreamsBuilder builder = new StreamsBuilder();
GlobalKTable<String, String> addressTable = builder.globalTable("address",Materialized.as("address"));
KafkaStreams streams = new KafkaStreams(builder.build(), configs);
streams.start();
view = streams.store(StoreQueryParameters.fromNameAndType(StoreQueryParameters.fromNameAndType(
                "address",
                QueryableStoreTypes.keyValueStore()));
ReadOnlyKeyValueStore<String, String> address = view.all();
address.forEachRemaining(keyValue -> log.info(keyValue.toString()));

이렇게 GlobalKTable로 설정할 경우 신기하게도 컨슈머 그룹이 생기지 않는데요. 그 이유는 KTable, GlobalKTable로 사용할 경우에는 커밋을 하지 않기 때문입니다.

https://stackoverflow.com/questions/63284146/does-a-kafka-streams-app-commit-offets-for-a-topic-used-to-fill-a-global-ktable

 

Does a Kafka Streams app commit offets for a topic used to fill a Global KTable?

I'm observing my Kafka Streams app reporting consumer lag for topics used to fill Global KTables. Is it correct that offsets are not committed for such topics? This would make sense as the topic is...

stackoverflow.com

Confluent 직원인 Matthias J. Sax에 따르면 다음과 같이 이야기 합니다.

Correct, offsets are not committed for "global topics" -- the main reason is, that all KafkaStreams instances read all partitions and committing multiple offsets is not possible.
You can still access the "global consumer" metrics, that also report their local lag.

커밋을 하지 않고 전체 데이터에 대해서 view를 만든다는 특징을 확인할 수 있습니다.


이런 특징은 스트림즈 애플리케이션으로 하여금 내부 state store table의 용량 이슈를 발생시킬 수 있는데요. 스트림즈의 뷰 특성상 tombstone데이터가 아닌 레코드들은 모두 가져와서 저장하여 사용하게 됩니다. 그렇기 때문에 충분히 사용한 데이터는 확인 후에 Record("특정 키", null)을 넣어줘야만 합니다. 이런 툼스톤 레코드를 통해 각 스트림즈 애플리케이션의 로컬에 저장된 데이터의 크기를 적당히 유지시켜 운영할 수 있습니다.

 

툼스톤 레코드에 대한 자세한 설명은 다음 링크에서 참조할 수 있습니다.

https://rmoff.net/2020/11/03/kafka-connect-ksqldb-and-kafka-tombstone-messages/

 

Kafka Connect, ksqlDB, and Kafka Tombstone messages

 

rmoff.net

One of the neat things that Kafka does with its messages is the concept of tombstone messages. These are messages with a null value. They’re usually used in conjunction with a key to indicate the logical deletion of a record. 

 

 

 

 

반응형