Flink eventTime keyed-window 某些键到达太慢时不会触发

Flink eventTime keyed-window not trigger when some keys arrive too slow

flink+kafka,2个topic分区,2个Parallelism;

env.setParallelism(2)
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
...
.keyBy(0) //("k",1576726230000)
.timeWindow(Time.seconds(2L))
...

打击问题:

"key1" 生成速度快,每秒 1 条消息

"key2" 生成速度慢,每 4 秒 1 条消息

那么window 2秒后不会触发,因为key2的水印到达比较慢

如何解决? 我有一个想法:setParallelism(1),所以 window 可以每 2 秒触发一次,但是如果我想保持 Parallelism(2) 并保持 window 触发 2 秒(或 2.5 秒超时到触发全部window),怎么做到的? 请多多指教,谢谢!

实际场景是白天消息比较快,晚上消息太慢,但是需要2秒更新一次。

解决此问题的一种方法是在将所有分区的事件混合在一起后生成水印,这样 slow/idle 分区就不会阻止整个水印:

stream
  .rebalance()
  .assignTimestampsAndWatermarks(...)
  .keyBy(...)
  .timeWindow(...)

这确实是以额外的网络洗牌为代价的。