Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Kafka KStreams问题与时间窗口聚合_Java_Apache Kafka_Spring Cloud_Apache Kafka Streams_Spring Cloud Stream - Fatal编程技术网

Java Kafka KStreams问题与时间窗口聚合

Java Kafka KStreams问题与时间窗口聚合,java,apache-kafka,spring-cloud,apache-kafka-streams,spring-cloud-stream,Java,Apache Kafka,Spring Cloud,Apache Kafka Streams,Spring Cloud Stream,我对KStreams聚合和windows有问题。我想将一条记录聚合到一个记录列表中,只要它落在一个时间窗口内,这些记录就具有相同的键。 我选择SessionWindows是因为我必须在会话中使用移动窗口:比如说,记录a在10:00:00到达;然后每隔一个记录使用相同的密钥到达 在10秒窗口内,时间(直到10:00:10)将进入同一会话,请记住,如果时间在10:00:03到达,窗口将移动到10:00:13(+10秒) 这使我们从给定键的最后一条记录开始有一个+10秒的移动窗口 现在的问题是:我想获

我对KStreams聚合和windows有问题。我想将一条记录聚合到一个记录列表中,只要它落在一个时间窗口内,这些记录就具有相同的键。 我选择SessionWindows是因为我必须在会话中使用移动窗口:比如说,记录a在10:00:00到达;然后每隔一个记录使用相同的密钥到达 在10秒窗口内,时间(直到10:00:10)将进入同一会话,请记住,如果时间在10:00:03到达,窗口将移动到10:00:13(+10秒)

这使我们从给定键的最后一条记录开始有一个+10秒的移动窗口

现在的问题是:我想获得最后一个聚合结果。我使用了.suppress()来表示我不想要任何中间结果,我只想要窗口关闭时的最后一个结果。这 工作不正常,因为虽然它不发送任何中间聚合结果,但当时间窗口结束时,我没有得到任何结果。我注意到,为了收到它,我需要出版另一本 信息进入主题,这在我的情况下是不可能的

通过阅读关于.suppress()的内容,我得出结论,这可能不是实现我想要的目标的方法,这就是为什么我的问题是:如何强制关闭窗口并发送最新的聚合计算结果

@StreamListener(ExtractContractBinding.RECEIVE_PAGE)
@SendTo(ExtractCommunicationBinding.AGGREGATED_PAGES) 
public KStream<String, List<Records>> aggregatePages(KStream<?, Record> input) { 
    input.map(this::getRecord)
            .groupBy(keyOfElement)
            .windowedBy(SessionWindows.with(Duration.ofSeconds(10L)).grace(Duration.ofSeconds(10L)))
            .aggregate(...do stuff...)
            .suppress(Suppressed.untilWindowCloses(unbounded()))
            .toStream()
            .map(this::createAggregatedResult);
}
@StreamListener(ExtractContractBinding.RECEIVE_页面)
@发送到(ExtractCommunicationBinding.AGGREGATED_页面)

公共KStream aggregatePages(KStream简而言之,发生这种情况的原因是因为在KStream和大多数其他计算聚合的流处理引擎中,时间是基于事件时间工作的

换言之,在新邮件到达时间超过您的时间窗口+宽限期(即延迟到达邮件的原因)之前,窗口无法关闭

此外,根据我最近编写的一些单元测试,我倾向于认为第二条消息需要与前一条消息放在同一个分区中,以使事件时间向前移动。实际上,当您在生产环境中运行并假定每秒处理数百条消息时,这一点变得不明显

我还要补充一点,您可以实现自定义时间戳提取器,它允许您根据特定消息到达的时间窗口进行细粒度控制

如何强制关闭窗口并发送最新的聚合计算结果

@StreamListener(ExtractContractBinding.RECEIVE_PAGE)
@SendTo(ExtractCommunicationBinding.AGGREGATED_PAGES) 
public KStream<String, List<Records>> aggregatePages(KStream<?, Record> input) { 
    input.map(this::getRecord)
            .groupBy(keyOfElement)
            .windowedBy(SessionWindows.with(Duration.ofSeconds(10L)).grace(Duration.ofSeconds(10L)))
            .aggregate(...do stuff...)
            .suppress(Suppressed.untilWindowCloses(unbounded()))
            .toStream()
            .map(this::createAggregatedResult);
}
要最终回答您的问题,不可能在不向源主题发送额外消息的情况下强制关闭时间窗口