这是一个非常经典的流式计算(如 Flink)中的“状态爆炸”(State Explosion)问题。 窗口长度 1 小时(3600秒),滑动步长 5 秒,意味着 $3600 / 5 = 720$ 个窗口重叠。如果使用原生的 Sliding Window,一条数据会被复制并分配到 720 个窗口的状态中,导致极大的 CPU 和内存开销。 这里提到的“活跃用户数”通常指 UV(去重用户数,Count Distinct),这是最难处理的。如果是普通 PV(不去重),优化相对简单。以下针对 UV 和 PV 提供工业界常用的几种彻底解决该问题的优化方案: --- 方案一:分片/切片窗口(Sliding Window -> Tumbling Windows 聚合) 核心思想:将滑动窗口转化为多个小的滚动窗口(Panes/Buckets)。 不要让一条数据归属 720 个窗口,而是按滑动步长(5秒)划分不重叠的滚动窗口(Tumbling Window)。 1. 第一层聚合: 每 5 秒为一个时间片(Bucket),每条数据只属于 1 个时间片,完全没有放大。在时间片内对用户进行初步聚合。 2....