Kafka, Kafka Streams
Kafka 를 유용하게 사용하고 있었고 웹플럭스를 활용할 신규 서비스에도 Kafka 를 적용하려고 하고 있었는데 Kafka Streams 라는 용어를 접하게 됐다. 처리속도가 빠르고 실시간 처리에 유리하다는데 Kafka 와는 다른건가? 더 좋은건가?
명확하게 구분이 되지 않아 서칭을 좀 해봤다. 일단 Kafka Streams 는 Consumer 에 포함되는 구성요소이다. 이는 Kafka Streams 를 사용하더라도 최초 Producer 는 기존에 Producer 작성하듯이 하면 된다는 말이다.
일반적으로 Consumer 에서 작업이 끝나지 않고 추가 토픽으로 전달이 필요한 경우 Kafka Streams 를 활용하는 것 같다. 그렇다면 Kafka Streams 를 사용하면 무슨 이득이 있는건가? 구조가 크게 단순화 된다. 아래 그림을 보면 이를 이해할 수 있을 것이다.
Kafka Consumer
Kafka Streams
이러한 구조의 단순화를 위해 Kafka Streams 는 "단일 Kafka 클러스터와만 상호 작용" 한다. 즉, 동일한 클러스터 내의 토픽끼리만 연결이 가능하다는 말이다.
이러한 구조의 단순화와 함께 Kafka Streams는 Consumer 기능을 포함해서 추가 기능을 제공하기 때문에 개발 더 단순화 되기도 한다.
그렇다면 처리속도는 어떤가? 구조가 단순화 되고 스레딩 모델을 기본적으로 지원하기 때문에 이를 활용하면 메시지 처리를 좀 더 빠르게 할 수 있다. 기본 Consumer 에서도 이게 불가능한 것은 아니지만 동일한 기능을 Kafka Streams 으로 구현하는 것이 더 쉽고 간단하다.
그럼 무조건 Kafka Streams 를 사용하는게 좋은거 아닌가? 꼭 그런 것은 아니다. 상황에 맞게 선택해야 한다.
위에서 이야기 했듯이 Kafka Streams 는 동일한 클러스터 내에서만 상호작용이 가능하기 때문에 서로 다른 클러스터 끼리 연결이 필요하다면 선택할 수 없고 일반 Consumer 는 단일처리, 일괄처리를 모두 지원하지만 Kafka Streams 는 단일처리만 지원한다.
번외로 Kafka Streams 의 설명을 보면 좀 꺼림찍한 말이 있다. "중요한 점은 KafkaStreams 라이브러리는 반응적이지 않으며 비동기 작업 및 역압 처리를 지원하지 않는다는 것입니다"
... 이럼.. 웹플럭스 환경에서 사용하기에는 좀 무리가 있지 않나? Reacrive Kafka 라는 것도 있다는데 이걸 더 서칭해보자..
https://www.tutorialworks.com/kafka-vs-streams-vs-connect/
https://www.baeldung.com/java-kafka-streams-vs-kafka-consumer
https://www.baeldung.com/java-kafka-streams
https://stackoverflow.com/a/58758670