【问题标题】:Kafka Streams Sort Within Processing Time WindowKafka Streams 在处理时间窗口内排序
【发布时间】:2018-08-21 23:07:15
【问题描述】:

我想知道是否有任何方法可以使用 Kafka Streams DSL 或处理器 API 对窗口内的记录进行排序。

想象以下情况为例(任意一种,但和我需要的差不多):

  1. 有一些事件的Kafka主题,比如说用户点击。假设主题有 10 个分区。消息是按键分区的,但每个键都是唯一的,所以它是一种随机分区。每条记录都包含一个用户 ID,稍后用于对流进行重新分区。

  2. 我们使用流,并将每条消息发布到另一个主题,按用户 ID 对记录进行分区(按用户 ID 重新分区原始流)。

  3. 然后我们消费这个重新分区的流,并将消费的记录存储在本地状态存储中,窗口为 10 分钟。特定用户的所有点击总是在同一个分区中,但不保证顺序,因为原始主题有 10 个分区。

  4. 我了解Kafka Streams的窗口模型,新记录进来的时候是提前的,但是我需要这个窗口使用处理时间,而不是事件时间,然后当窗口过期时,我需要能够对缓冲的事件进行排序,并按该顺序将它们发送到另一个主题。

注意:

  1. 我们需要能够使用处理时间而不是事件时间来刷新/处理窗口内的记录。我们等不及下一次点击来提前时间,因为它可能永远不会发生。

  2. 我们需要从存储中删除所有记录,尽快对窗口进行排序和刷新。

  3. 如果应用程序崩溃,我们需要恢复(在应用程序的同一个或另一个实例中)并处理所有未处理的窗口,而无需等待特定用户的新记录出现。

我知道 Kafka Streams 1.0.0 允许在处理 API 中使用挂钟时间,但我不确定实现我需要的正确方法是什么(更重要的是考虑到上述恢复过程要求) .

【问题讨论】:

标签: apache-kafka apache-kafka-streams stream-processing


【解决方案1】:

您可以在此处查看我对类似问题的回答: https://stackoverflow.com/a/44345374/7897191

由于您的消息密钥已经是唯一的,您可以忽略我关于重复数据删除的 cmets。

现在 KIP-138(挂钟标点语义)已在 1.0.0 中发布,您应该能够毫无问题地实现概述的算法。它使用处理器 API。我不知道仅使用 DSL 的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多