我目前正在开发一个聚合来自多个消息(8)的数据的流程序,聚合需要所有8条消息,所以我使用的是计数窗口。所有8条消息共享相同的唯一密钥。但是,无法保证所有8条消息都会到达。所以我的问题是双重的:
首先,永不关闭的Flink计数窗口会发生什么?我假设窗户只是累积加班,消耗越来越多的公羊。
如果在给定时间内没有收到所有消息,我可以关闭计数窗口吗?我正在寻找尽可能实时的解决方案,我已经尝试过使用时间窗口,但是消息的飞行时间在几毫秒到40秒之间变化。
所以基本上有一种方法来定义一个触发8条消息的窗口,并在给定时间后(在这种情况下是60秒后)从窗口中驱逐所有消息?
答案 0 :(得分:1)
关于永不关闭窗口的问题的答案是,为他们保留的状态部分永远不会被释放。
您所描述的行为可以通过Global Window上的自定义触发器和逐出器来实现。触发器可以在发出窗口之前等待预期的时间或元素数量,而如果小于8,则逐出器将驱逐所有消息。对于某些参考实现,您可以查看CountTrigger
(发出计数)和EventTimeTrigger
(按时发出)。对于逐出者,请查看CountEvictor
。
答案 1 :(得分:1)
对于这样的情况,您需要将有状态流处理与计时器相结合,ProcessFunction
可能是一个不错的选择。请参阅https://ci.apache.org/projects/flink/flink-docs-release-1.2/dev/stream/process_function.html。