每个键的动态 window 聚合

Dynamic window aggregation for each key

我有一个特定的用例,我在其中使用来自单个主题的数据。 该主题接收包含特定类型的消息。

我的服务在这些类型和时间之间有一个映射 window(例如类型 X 是 1 小时,类型 Y 是 2 小时,等等)。 我想知道的是 - 是否有可能创建一个单一的流,它将能够使用一条消息,获取它的类型,然后根据我拥有的映射创建一个动态大小的 window 聚合。

例如,假设我的主题包含 3 条消息,并且我的服务具有以下映射:

Tpye X - 1 hour, Type Y - 2 hours

这些是当前在我的 Kafka 输入主题中的消息:

1. Type X
2. Type Y
3. Type X

当第一条消息到达时,我希望为类型 X 创建一个持续 1 小时的 window 聚合。一小时结束后,我希望发生某种业务逻辑。 当第二条消息到达时,它是 Y 类型的,因此创建了一个不同的 window 2 小时,完成后我还想要一些特定的代码 运行。

我知道我可以通过将消息分隔到指定的主题(每个消息类型一个)来实现这一点,但是类型是动态的,我想避免 creating/destroying 个主题。

我也查看了 Session windows,但不活动间隔仍然是静态的,它没有解决我的用例。

看来您要找的不是窗口本身,而是某种计时器。 Kafka Streams 不提供现成的计时器。然而,解决它的一种方法是使用处理器 API 安排标点符号: https://docs.confluent.io/current/streams/developer-guide/processor-api.html#defining-a-stream-processor

但它仍然需要一个固定的参数——即不是动态的。如果这是绝对必要的,也可以通过 registring a timer using Apache Flink for example.

来完成

定时标点功能

Kafka Streams 使用 固定时间 标点符号时,有一种可能性:

  1. 分开,即将不同类型的流分支

  2. 实现自定义 Processor class:

https://gist.github.com/dvcanton/45818abf4903b54f9fb0028025b6729a