interval join的实现主要依靠IntervalJoinOperator,下面详细分析IntervalJoinOperator代码
概览
IntervalJoinOperator可以通过使用可配置的下界和上界,精确地发出(T1, T2)其中T2.ts∈(T1.ts +下界,T1.ts + upperBound]。下界和上界都可以配置为包含或排他。
元素一旦连接起来,就会传递给用户定义的ProcessJoinFunction。
这个实现的基本思想如下:每当我们在processElement1(StreamRecord)(也就是左边)接收到一个元素时,我们将它添加到左边缓冲区。然后检查右侧的缓冲区,看看是否有可以连接的元素。如果有,则将它们连接并传递给上述函数。当接收到右边的元素时,同样的情况也会发生。
发送的这一对元素的时间戳=max(左侧元素时间戳,右侧元素时间戳)。
为了避免元素缓冲区无限增长,我们为每个元素注册一个清理计时器。这个计时器指示什么时候一个元素不再被join并且可以从状态中删除。
怎么管理左右缓存
管理缓存的逻辑在IntervalJoinOperator.processElement方法中,每来一个元素,都会调用internalTimerService.registerEventTimeTimer方法为该元素注册一个cleanupTime&