Apache flink 断开连接场景中的Flink事件时间处理

Apache flink 断开连接场景中的Flink事件时间处理,apache-flink,flink-streaming,Apache Flink,Flink Streaming,Flink在这里提供了一个例子:这描述了一个场景,有人正在玩游戏,由于subway而失去连接,然后当他重新联机时,所有数据都会恢复,并且可以进行排序和处理 我的理解是,如果有更多的玩家,有两种选择: 所有其他用户将被延迟,等待该用户恢复连接并发送允许推送水印的数据 该用户被分类为空闲用户,允许水印向前移动,当他连接时,其所有数据将进入后期数据流 我希望有以下选择: 每个用户都独立处理其会话窗口的水印。理想情况下,我甚至会使用接收时间(因此,当他恢复连接时,我会将所有数据放入一个唯一的会话中,该会

Flink在这里提供了一个例子:这描述了一个场景,有人正在玩游戏,由于subway而失去连接,然后当他重新联机时,所有数据都会恢复,并且可以进行排序和处理

我的理解是,如果有更多的玩家,有两种选择:

  • 所有其他用户将被延迟,等待该用户恢复连接并发送允许推送水印的数据

  • 该用户被分类为空闲用户,允许水印向前移动,当他连接时,其所有数据将进入后期数据流

  • 我希望有以下选择: 每个用户都独立处理其会话窗口的水印。理想情况下,我甚至会使用接收时间(因此,当他恢复连接时,我会将所有数据放入一个唯一的会话中,该会话在会话关闭后按事件时间戳排序),并且当前时间和我正在处理的窗口的最后一个时间戳(接收)之间会有一个间隙(会话窗口根据终止会话的时间间隔来保证这一点);我也不希望在一个用户失去连接时水印被卡住,我也不希望管理空闲状态:只要继续正常处理所有其他事件,并且一旦该用户返回,不要将任何数据归类为延迟数据,因为与用户失去连接时相比,水印在时间上提前了

    如何实现上述要求?由于水印是全局性的,我一直很难做到没有这样的场景。是否有一个简单的解释可以解释为什么每个密钥都没有水印


    提前感谢!

    Flink的水印最直接支持这一点的可能是对每卡夫卡分区水印的支持——对于您描述的情况,这并不是一个实际的解决方案(因为每个用户都有卡夫卡分区是不现实的)

    可以做的只是忽略水印,并使用KeyedProcessFunction自己实现逻辑

    顺便说一句,最近在flink用户和flink dev邮件列表的主题下都有一条关于这一点的帖子