当使用 1 个分区时,何时在 KTable 上使用 GlobalKTable

When to use GlobalKTable over KTable when 1 partition is used

我理解两者之间的区别,但是,我似乎仍然将 KTable 用作 "default",我真的不知道什么时候更喜欢 GlobalKTable.

请分享您的经验,什么时候必须使用 GlobalKTable,为什么不使用它等等。

关键是 KTable 是分区的,这意味着如果您有一个包含 N 个分区的基础主题,则负责这些分区子集的实例将可以访问这些分区上的数据,但不是此实例未管理的分区上的数据。

但是,GlobalKTable 将使用 all 个实例中的 all 个主题数据。例如,您希望将它用于与一组外部数据的连接,这些数据的分区与传入数据没有直接链接(或者无法预测其关系)。

例如假设您有一个来自 users 主题的流,具有默认的循环分区,它有一个 country 字段,并且您需要使用来自用户国家/地区的数据来丰富该 users 流。然后,您可以使用带有国家/地区数据的 GlobalKTable,并加入例如users 流与那个 country GlobalKTable 在国家/地区。

由于 GlobalKTable 允许您访问所有潜在的 joinable 数据,因此对于较小的数据,它比 KTable 更有效,因为您不需要重新分区数据对于该连接(所有数据都在那里)。但是您应该注意大小:您必须处理每个分区中的所有数据集。这就是为什么它通常用于有限大小的数据集合,也不是超大的。

如果您在 KStreamKTable 之间执行连接,则需要重新分区数据(创建内部主题),以根据连接键重新分组数据。

类似地,如果您使用处理器 API,如果您从一个实例查询 KTable,您将拥有该实例生成的数据,而不是另一个实例生成的数据实例。

更新:另请参阅@matthias-j-sax 对同步的评论。