使用 1 个分区时何时使用 GlobalKTable 而不是 KTable

Aar*_*_ab 4 apache-kafka-streams kafka-streams-scala

我理解这两个之间的区别,但是,我似乎仍将其KTable用作“默认值”,而不是真正知道何时更喜欢GlobalKTable.

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

xma*_*mar 8

关键是它KTable是分区的,这意味着如果您有一个包含 N 个分区的基础主题,那么处理这些分区子集的实例将有权访问这些分区上的数据,但不能访问此分区上的数据实例未管理。

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

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

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

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

同样,如果您使用处理器 API,如果您KTable从一个实例查询 a ,您将在那里获得由该实例生成的数据,而不是其他实例。

更新:另见@matthias-j-sax 关于同步的评论。