Scala 使用onEventTime触发器的Flink会话窗口?

Scala 使用onEventTime触发器的Flink会话窗口?,scala,apache-flink,flink-streaming,Scala,Apache Flink,Flink Streaming,我想在Flink中创建一个基于事件时间的会话窗口,这样当新消息的事件时间比创建该窗口的消息的事件时间长180秒以上时,它就会触发 例如: t1(0秒):msg1实现这一点的最佳方法可能是使用ProcessFunction,而不是使用自定义窗口。如您的示例所示,如果事件将按时间戳顺序处理,那么这将非常简单。另一方面,如果您必须处理无序事件(这在处理事件时间数据时很常见),那么它将稍微复杂一些。(假设msg6的for time 187在t8之后到达。如果这是可能的,并且如果这会影响您想要产生的结果,

我想在Flink中创建一个基于事件时间的会话窗口,这样当新消息的事件时间比创建该窗口的消息的事件时间长180秒以上时,它就会触发

例如:


t1(0秒):msg1实现这一点的最佳方法可能是使用ProcessFunction,而不是使用自定义窗口。如您的示例所示,如果事件将按时间戳顺序处理,那么这将非常简单。另一方面,如果您必须处理无序事件(这在处理事件时间数据时很常见),那么它将稍微复杂一些。(假设msg6的for time 187在t8之后到达。如果这是可能的,并且如果这会影响您想要产生的结果,那么必须对此进行处理。)

如果事件是有序的,那么逻辑大致如下:

使用AscendingTimestampExtractor作为水印的基础

使用Flink状态(可能是ListState)存储窗口内容。当事件到达时,将其添加到窗口,并检查第一个事件发生后是否超过180秒。如果是,请处理窗口内容并清除列表


如果事件的顺序可能不正确,请使用BoundedAutoFordernessTimestampExtractor,在currentWatermark指示事件时间超过窗口开始时间180秒之前,不要处理窗口的内容(可以使用事件时间计时器)。触发窗口时,不要完全清除列表,只需删除属于正在关闭的窗口的元素。

谢谢。这样的逻辑,即使实现正确,在将来对其他人来说可能有点复杂。因此,我选择将密钥和经过计算的时间存储在缓存中,而不必存储或打开连续的事件流。缓存也可能比其中的许多窗口和事件消耗更少的内存。事件可能是无序的。有一个窗口到期时间可能是一个有用的特性,这样窗口会在该时间之后自动触发。