轻微乱序
WatermarkStrategy
.forBoundedOutOfOrdernessEvent(Duration.ofMinutes(5))
.withTimestampAssigner((event, _) => event.eventTime)
// 降低水位线的推进
窗口状态保留 等待晚点的数据
stream
.keyBy(_.userId)
.window(TumblingEventTimeWindows.of(Time.minutes(10)))
.allowedLateness(Time.minutes(5))
.reduce(...)
//使用 allowedLateness 窗口已经触发后,仍然允许一段时间内的迟到数据更新窗口结果
// 这会导致窗口状态清理延迟 状态变大
侧数据流收集后单独处理
val lateTag = new OutputTagEvent("late-data")
val result = stream
.keyBy(_.userId)
.window(TumblingEventTimeWindows.of(Time.minutes(10)))
.allowedLateness(Time.minutes(5))
.sideOutputLateData(lateTag)
.reduce(...)
val lateStream = result.getSideOutput(lateTag)
这些数据可以用于:
- 落库留痕。
- 发送告警。
- 离线补偿。
- 人工排查。
- 回灌重算。