kafka Streams - 加入分区主题

Dar*_*ren 3 apache-kafka apache-kafka-streams

我的理解是kafka流支持分区。我想知道当连接来自两个不同主题的数据时它是如何工作的?我假设为了连接基于两个不同主题的数据,客户端应用程序必须以某种方式保证从两个主题获取的消息共享相同的密钥。只是想知道 kafka Streams 是如何做到这一点的?

Yam*_*amm 6

能够进行stream-stream、ktable-ktable或stream-ktable连接有几个先决条件;

  • 主题需要共同划分。这意味着它们必须具有相同数量的分区。这一要求实际上是一项艰巨的任务,如果主题未共同分区,则流 API 将不允许加入,并且TopologyBuilderException在即将分配分区时会在运行时抛出异常。

除了此要求之外,任何连接都可以工作,但为了使其正常工作,必须满足许多附加要求,例如:

  • 两个主题应使用相同的密钥架构。例如,如果一个主题使用 userName 作为键,而其他 userSurname 联接操作将起作用,但很可能不会产生任何有意义的输出。
  • 写入连接主题的生产者应用程序应使用相同的分区策略。这样,相同的键将最终出现在分配要连接的相同分区中。
  • 两个主题应使用相同的消息时间戳策略(logAppendTime 或 CreateTime)。这并不是一个要求,但如果主题使用不同的 messageTimeStampTypes,则应该考虑窗口连接,因为 messageTimeStamps 用于确定要连接在一起的相关消息,缺少这一点可能会导致很难发现错误。

GlobalKTable 连接没有任何此类要求,并且将适用于每个主题,无论分区数量、分区策略如何,因为 globalKTable 的所有数据都将呈现给每个流实例。

当消息生成时,它们将根据其键和分区策略发送到分区,流 API 将每个主题的相同主题分区分配给同一处理器,以便来自同一主题的具有相同键的所有相关消息将在同一处理器中处理。对于窗口连接,消息时间戳被认为是查找要加入该特定窗口的消息,并在连接完成后发出结果。