首页 > 解决方案 > 丢失连接场景下的 Flink 事件时间处理

问题描述

Flink 在这里提供了一个示例:https ://www.ververica.com/blog/stream-processing-introduction-event-time-apache-flink描述了某人正在玩游戏,由于地铁而失去连接的场景,然后当他重新上线了所有数据都回来了,可以进行排序和处理。

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

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

  2. 该用户被归类为空闲,允许水印向前移动,当他连接时,他的所有数据都将进入后期数据流;

我希望有以下选项:每个用户都被独立处理,并为其会话窗口使用自己的水印。理想情况下,我什至会使用摄取时间(因此,当他恢复连接时,我会将所有数据放入一个唯一的会话中,一旦会话关闭,该会话将按事件时间戳排序)并且当前时间和最后一个时间之间会有一个差距我正在处理的窗口的时间戳(摄取)(会话窗口根据终止会话的时间间隔来保证这一点);一旦一个用户失去连接,我也不希望水印被卡住,我也不想管理空闲状态:

我该如何实现上述要求?由于水印是全球性的,我一直很难处理这样的场景。每个键都没有水印有简单的解释吗?

先感谢您!

标签: apache-flinkflink-streaming

解决方案


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

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

顺便说一句,最近在主题为Per Key Grained Watermark Support的 flink-user 和 flink-dev 邮件列表上有一个关于此的主题。


推荐阅读