Kafka Streams reduceByKey 与 leftJoin

Kafka Streams reduceByKey vs. leftJoin

乍一看,我觉得 KStream#reduceByKey 可以实现与 KStream to KTable leftJoin 相同的功能。即用相同的键组合记录。两者在性能方面有什么区别?

KStream 表示一个记录流,其中每条记录都是独立的。例如,如果我们要总结单词出现的次数,它会在特定帧(例如时间 window 或段落)内保存计数。 KTable 代表一种状态,每条记录进来,通常会保存总出现次数。 因此,使用每种方法的用例是完全不同的。虽然 KStream#reduceByKey 会减少同一键中的所有记录并汇总每个键的计数,但 KTable#leftJoin 通常用于需要根据传入的其他信息调整总计数或将更多数据组合到记录。 Kafka Stream 的文档中给出的示例是用于日志压缩的。使用 KStream 时,不会丢弃任何记录,而在 KTable 中,将删除不再相关的记录。

简答:(两者有什么区别?)

reduceByKey 应用于 单个输入流 leftJoin 组合 两个 streams/tables .

长答案:

如果我对你的问题的理解正确,那么你传入的 KTable 更新日志流似乎是空的,你想为每个更新日志流计算一个新的连接结果(即更新结果 KTable)传入KStream记录?连接的结果 KTable 不可作为物化视图使用,但只会将更改日志主题发送到下游。因此,您的输入 KTable 将始终为空,并且您的输入 KStream 记录将始终与 "nothing" 连接(因为左连接),这不会真正更新结果 KTable。您还可以执行 KStream#map() —— 如果您的输入 KTable 不提供状态,则没有您可以利用的状态。

相比之下,如果您使用 reduceByKey,结果 KTable 可作为物化视图使用,因此对于每个 KStream 输入记录,先前的结果值可用于获取已更新。

因此,这两种操作是根本不同的。如果您使用连接(需要两个输入)有一个输入 KStream 会很奇怪,因为没有 KTable...