Flink在此处提供了一个示例:https://www.ververica.com/blog/stream-processing-introduction-event-time-apache-flink描述了某人正在玩游戏,由于地铁而失去连接,然后当他重新联机时所有数据又可以归类并可以进行处理的情况。
我的理解是,如果有更多的玩家,则有两个选择:
所有其他组件将被延迟,等待该用户恢复连接并发送允许推送水印的数据;
此用户被分类为空闲,允许水印向前移动,当他连接时,他的所有数据将进入后期数据流;
我希望有以下选择:每个用户使用其自己的会话窗口的水印进行独立处理。理想情况下,我什至会使用摄取时间(因此,当他恢复连接时,我会将所有数据放入一个唯一的会话中,该会话将在会话关闭后稍后按事件时间戳排序),并且当前时间与最后一个时间之间会有间隔我正在处理的窗口的时间戳(插入)(会话窗口基于终止会话的时间间隔来保证这一点);我也不想让一个用户失去连接就不会卡住水印,也不想管理空闲状态:只要继续正常处理所有其他事件,并且一旦这个用户回来就不要将任何数据归类为延迟数据由于与用户断开连接相比,水印在时间上有所提前;
我如何实施上述要求?由于水印是全球性的,我一直很难工作,无法解决任何这样的情况。是否为每个键没有水印有一个简单的解释?
谢谢您!
最接近的Flink的水印直接支持这一点可能是对每个kafka分区水印的支持-这并不是您所描述情况的实际解决方案(因为每个用户拥有kafka分区是不现实的) 。
可以做的就是简单地忽略水印,并使用KeyedProcessFunction自己实现逻辑。
顺便说一句,最近在主题Per Key Grained Watermark Support下的flink-user和flink-dev邮件列表上都有一个与此相关的主题。