Flink 的状态 TTL(Time-To-Live,生存时间)机制允许用户为算子的状态设置一个过期时间。如果状态在规定时间内没有被更新(或访问),它将被视为过期并最终被清除。这对于控制状态大小、防止内存溢出(OOM)以及处理无界流数据至关重要。 以下是 Flink 状态 TTL 机制的详细工作原理,包括配置、内部存储、过期逻辑和清理策略。 --- 1. 核心工作原理 A. 内部存储结构的改变 当你为一个状态开启 TTL 后,Flink 不仅仅存储用户的数据,还会额外存储一个时间戳(Last Modification Timestamp)。 没有 TTL 时: 存储 开启 TTL 后: 存储 这意味着开启 TTL 会增加一定的存储开销(通常每个状态项增加 8 字节的 Long 类型时间戳)。 B. 判断过期的逻辑 Flink 默认使用处理时间(Processing Time)来判断状态是否过期。 逻辑很简单: $$ 当前系统时间 - 上次修改时间 > TTL 配置时间 \Rightarrow 过期 $$ --- 2. 配置与行为 () 在使用 TTL 时,需要通过 来定义行为。主...