Hi!
我观察到 flink 双流 join ttl 处理的一些现象,望解答:
kafka 中存有 students,courses 两个 topic 作为输入流,表结构如下:
students s:id,name
courses c:stu_id,name,score
两条流通过 s.id = c.stu_id 关联,ttl 设置的过期时间为 2min

测试sql:

SELECT s.id, s.name, c.course, c.score FROM student AS s LEFT JOIN
courses AS c ON s.id = c.stu_id

测试现象:
ttl 时效内(2min) 内如果新输入的右流数据能关联上原有的左流数据,则左流关联数据 ttl 时间刷新

现象推论:
内关联:内关联数据过期只与数据在 state 的创建时间和 ttl 时效有关
左外关联(学生流为左流):右流数据过期只与数据在 state 的创建时间和 ttl 时效有关,左流除了上述两个因素外还与右流数据有关
总结:内连接和外连接 inner 的过期策略类似OnCreateAndWrite,而外连接的 outer 过期策略则类似OnReadAndWrite

源码验证:
核心代码位置:StreamingJoinOperator#processElement,外关联中如果 input 不为outer 且能关联上
outer 的信息,则更新 outer 信息的上次访问时间

疑问:
不知道我表述的是否清楚,这个 ttl 问题是一个 bug 呢,还是就是这么设计的,如果是设计的话,是怎么考虑的呢?谢谢

flink 版本:1.13.1

回复