我想知道是否有办法使用Kafka Streams DSL或Processor API对窗口内的记录进行排序。
想象一下以下情况作为一个例子(任意一个,但与我需要的相似):
有一些事件的Kafka主题,比方说用户点击。假设主题有10个分区。消息按密钥分区,但每个密钥都是唯一的,因此它是一种随机分区。每条记录都包含一个用户ID,稍后将用于对流进行重新分区。
我们使用流,并将每条消息发布到另一个主题,按照用户ID对记录进行分区(按用户ID重新分区原始流)。
然后我们使用这个重新分区的流,并将消耗的记录存储在10分钟窗口的本地状态存储中。特定用户的所有点击始终位于同一分区中,但订单不受保证,因为原始主题有10个分区。
我理解Kafka Streams的窗口模型,当新记录进入时,时间会提前,但是我需要这个窗口来使用处理时间,而不是事件时间,然后当窗口过期时,我需要能够对缓冲的事件进行排序,并按顺序将它们发送到另一个主题。
注意:
我们需要能够使用处理时间而不是事件时间来刷新/处理窗口内的记录。我们不能等待下一次点击提前,因为它可能永远不会发生。
我们需要从商店中删除所有记录,因为很快就会对窗口进行排序和刷新。
如果应用程序崩溃,我们需要恢复(在应用程序的相同或另一个实例中)并处理所有未处理的窗口,而不等待特定用户的新记录。
我知道Kafka Streams 1.0.0允许在Processing API中使用挂钟时间,但我不确定实现我需要的正确方法是什么(更重要的是考虑到上述恢复过程要求)
答案 0 :(得分:1)
您可以在此处查看我对类似问题的回答: https://stackoverflow.com/a/44345374/7897191
由于您的消息密钥已经是唯一的,因此您可以忽略我对重复数据删除的评论。
现在已经在1.0.0中发布了KIP-138(挂钟标点符号语义),你应该能够毫无问题地实现概述的算法。它使用Processor API。我不知道只用DSL做这件事的方法。