真实写一份不到40行的Kafka Streams程序做单词计数,验证一条输入消息是怎么经过flatMap拆分、groupBy分组、count聚合,最终变成一份带状态的计数结果输出的。
命令 · java (WordCountWindowed.java) KStream<String, String> lines = builder.stream("streams-input"); KStream<String, String> words = lines.flatMapValues( v -> Arrays.asList(v.toLowerCase().split("\\s+"))); KTable<Windowed<String>, Long> counts = words .groupBy((k, v) -> v) .windowedBy(TimeWindows.ofSizeAndGrace(Duration.ofSeconds(5), Duration.ofSeconds(1))) .count(Materialized.as("word-count-windowed-store")); counts.toStream().to("streams-output");
用发行包自带的kafka-streams-4.3.1.jar真实javac编译、java直接运行,不需要额外下载任何依赖——这份拓扑真实做了三件事:flatMapValues把一行文本拆成多个词,groupBy按词本身重新分组,count对每个分组累加计数。
命令 · python p.produce("streams-input", value="hello kafka hello")
kafka@[1790563690000-1790563695000) -> 1 hello@[1790563690000-1790563695000) -> 2
每一步都是本文上面用真实运行的Kafka Streams程序跑出来的原始结果。