失联场景下的Flink事件时间处理

Flink event time processing in lost connection scenarios

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

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

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

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

我想要以下选项: 每个用户的会话都使用自己的水印独立处理 window。理想情况下,我什至会使用摄取时间(这样当他恢复连接时,我会将所有数据放入一个唯一的会话中,一旦会话关闭,该会话稍后将按事件时间戳排序)并且当前时间和上次时间之间会有差距我正在处理的 window 的时间戳(摄取)(会话 window 根据终止会话的时间间隔保证这一点);我也不希望水印在一个用户失去连接后被卡住,我也不想管理空闲状态:只需继续正常处理所有其他事件,一旦该用户返回,不要将任何数据分类为延迟数据由于与用户失去连接的时刻相比,水印在时间上提前了;

我怎样才能实现上面的要求?由于水印是全球性的,我一直很难处理这样的场景。对于每个键都没有水印,有没有简单的解释?

提前致谢!

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

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

顺便说一句,最近在主题 Per Key Grained Watermark Support.

下的 flink-user 和 flink-dev 邮件列表中都有一个关于此的线程