KTable 与 GlobalKTable 以及左 Join() 与外部 Join() 之间有什么区别?

What are the differences between KTable vs GlobalKTable and leftJoin() vs outerJoin()?

在Kafka Stream库中,我想知道KTable和GlobalKTable的区别

同样在KStreamclass中,有leftJoin()outerJoin()两种方法。这两种方法还有什么区别?

我读了 KStream.leftJoin,但没有找到确切的区别。

KTable VS GlobalKTable

A KTable 对所有 运行 Kafka Streams 实例之间的数据进行分片,而 GlobalKTable 具有每个实例上所有数据的完整副本。 GlobalKTable 的缺点是它显然需要更多的内存。优点是,您可以使用流中的非键属性进行 KStream-GlobalKTable 连接。对于 KStream-KTable 连接和连接的非键流属性只能通过提取连接属性并将其设置为连接之前的键——这将导致在连接之前流的重新分区步骤被计算。

注意,还有一个语义差异:对于stream-table join,Kafka Stream align record processing ordered based on record timestamps。因此,对 table 的更新与您流的记录对齐。对于 GlobalKTable,没有时间同步,因此更新为 GlobalKTable 并与流记录的处理完全分离(因此,语义较弱)。

有关详细信息,请参阅 KIP-99: Add Global Tables to Kafka Streams

leftJoin() VS outerJoin()

关于左连接和外连接:就像在数据库中分别是左外连接和全外连接。

对于左外部联接,您可能 "lose" 右侧输入流的数据,以防左侧的联接不匹配。

对于(完全)外部联接,不会删除任何数据,并且两个流的每个输入记录都将在结果流中。