【问题标题】:Dynamic window aggregation for each key每个键的动态窗口聚合
【发布时间】:2020-05-19 08:14:35
【问题描述】:

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

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

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

Tpye X - 1 hour, Type Y - 2 hours

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

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

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

我知道我可以通过将消息分离到指定的主题(每种消息类型一个)来实现这一点,但是这些类型是动态的,我想避免创建/销毁主题。

我还查看了会话窗口,但不活动间隙仍然是静态的,它不能解决我的用例。

【问题讨论】:

    标签: kafka-consumer-api apache-kafka-streams


    【解决方案1】:

    看来您正在寻找的不是太多的窗口本身,而是某种计时器。 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类:

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

    【讨论】:

    • 我怀疑在这种情况下 Flink 能比 Kafka Streams 做更多的事情......即使使用 Timers 可能会更简单一些——但是,你可以安排任意数量的标点符号(即一个在这种情况下按类型),并且您可以在任何时候取消它们(即,如果您在触发后取消标点符号,它就像一个计时器一样工作)
    猜你喜欢
    • 2022-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 2022-08-13
    • 1970-01-01
    相关资源
    最近更新 更多