Kafka 카프카 스트림즈 DSL
Kafka Streams DSL
스트림즈 DSL로 구성된 애플리케이션을 코드로 구현하기 전에 스트림즈DSL 에서 다루는 새로운 개념들에 대해 짚고 넘어가야 한다. 스트림즈 DSL에는 레코드의 흐름을 추상화한 3가지 개념인 KStream, KTable, GlobalKTable이 있다.
이 3가지 개념은 컨슈머, 프로듀서, 프로세서 API에서는 사용되지 않고 스트림즈 DSL에서만 사용되는 개념이다.
KStream
KStream은 레코드의 흐름을 표현한 것으로 메세지 키와 메세지 값으로 구성되어 있다.
- KStream으로 데이터를 조회하면 토픽에 존재하는(또는 KStream에 존재하는) 모든 레코드가 출력된다.
- KStream은 컨슈머로 토픽을 구독하는 것과 동일한 선상에서 사용하는 것이라고 볼 수 있다.
KTable
KTable은 KStream과 다르게 메세지 키를 기준으로 묶어서 사용한다.
- KStream은 토픽의 모든 레코드를 조회할 수 있지만 KStream은 토픽의 모든 레코드를 조회할 수 있지만 KTable은 유니크한 메세지 키를 기준으로 가장 최신 레코드를 사용한다.
- 그러므로 KTable로 데이터를 조회하면 메세지 키를 기준으로 가장 최신에 추가된 레코드의 데이터가 출력된다.
- 새로 데이터를 적재할 때 동일한 메세지 키가 있을 경우 데이터가 업데이트 되었다고 볼 수 있다. 왜냐하면 메세지 키의 가장 최신 레코드가 추가되었기 때문이다.
토픽에 있는 데이터를 key-value 형태로 사용하는 것과 유사하다.
- 예를 들어, 토픽 중에 사용자의 주소 데이터 같은 경우가 있을 수 있다. 가장 최신의 주소만 필요한 상태이기 때문에 KTable을 운영할 수 있다.
코파티셔닝(co-partitioning)
KStream과 KTable 데이터를 조인한다고 할때 KStream과 KTable을 조인하려면 반드시 코파티셔닝되어 있어야 한다.
코파티셔닝이란 조인을 하는 2개 데이터(토픽)의 파티션 갯수가 동일하고 파티셔닝 전략을 동일하게 맞추는 작업이다.
파티션 갯수가 동일하고 파티셔닝 전략이 같은 경우에는 동일한 메세지 키를 가진 데이터가 동일한 태스크에 들어가는 것을 보장한다.
이를 통해 각 태스크는 KStream의 레코드와 KTable의 메세지 키가 동일할 경우 조인을 수행할 수 있다.
코파티셔닝되지 않은 2개 토픽의 이슈
문제는 조인을 수행하려는 토픽들이 코파티셔닝되어 있음을 보장할 수 없다는 것이다. KStream과 KTable로 사용하는 2개의 토픽이 파티션 갯수가 다를 수도 있고 파티션 전략이 다를 수 있다.
이런 경우에는 조인을 수행할 수 없다. 코파티셔닝이 되지 않은 2개의 토픽을 조인하는 로직이 담긴 스트림즈 애플리케이션을 실행하면 TopologyException이 발생한다.
GlobalKTable
코파티셔닝되지 않은 KStream과 KTable을 조인해서 사용하고 싶다면 KTable을 GlobalKTable로 선언하여 사용하면 된다.
GlobalKTable은 코파티셔닝되지 않은 KStream과 데이터 조인을 할 수 있다.
왜냐하면 KTable과 다르게 GlobalKTable로 정의된 데이터는 스트림즈 애플리케이션의 모든 태스크에 동일하게 공유되어 사용되기 때문이다.
- GlobalKTable의 대상이 되는 토픽의 양이 비대할 경우 프로세싱에 부하가 발생할 수 있다.
Comments