在 Flink 中进行长期(如自然月)的 UV(Unique Visitor,独立访客)计算,状态(State)无限制膨胀是一个非常经典的痛点。 如果你直接使用 或 把所有的 UserID 存下来,到了月末,State 的大小会随着用户量呈线性($O(N)$)暴增,这会导致 Checkpoint 变慢、甚至 OOM 或任务崩溃。 针对这个问题,不能单纯依赖一种方法,而是要根据“是否需要 100% 精确”和“统计的是自然月还是滚动月”来选择方案。以下是几种业界最常用的破局思路: --- 一、 避坑指南:为什么不能简单粗暴地用 State TTL? 很多人的第一反应是给 State 设置一个 30 天的 TTL。但这对于“自然月(如1月1日-1月31日)”统计是错误的! 错误原因:Flink 的 State TTL 是基于最后一次访问/修改时间来计算的(滚动过期)。假设你在 1月31日 访问了,TTL 设为 30天,那么你的状态会保留到 3月2日。如果在 2月1日 你再次访问,系统会发现你的状态还在,把你当作“已经统计过”的旧用户,从而导致 2 月份的 UV 漏算。 适用场景:简单的...