第 283 题:实现实时指标的流式计算,滑动窗口的增量更新。
题目
实现实时指标的流式计算,滑动窗口的增量更新。
完整讲解
一、实时指标与流式计算
- 实时指标:PV、UV、CTR、分桶统计等需在事件流上持续更新,延迟要求秒级或亚秒级。流式计算即对每条或每批事件做增量更新,而非离线批处理。
二、滑动窗口
- 窗口:按时间或条数划定范围,如「最近 5 分钟」「最近 1 万条」。滑动即窗口随时间/事件推进而移动,每个时刻只统计窗口内数据。
- 类型:滚动窗口(不重叠)、滑动窗口(可重叠,如每 1 分钟输出过去 5 分钟)、会话窗口(按 gap 切分)。实时指标常用滑动窗口(如最近 1 小时 CTR)。
三、增量更新
- 计数:窗口内 count、sum 可增量维护:新事件进窗则 +1 或 +value,事件出窗则 -1 或 -value。需能识别「出窗」:按事件时间则需按时间戳排序或用水印;按处理时间则可用环形缓冲区按 slot 计数。
- 去重:UV 等需去重时,可用 HyperLogLog 或 Bloom filter 做近似;窗口滑动时需支持「减去过期桶」的 HLL 或分层 HLL。
- 复杂聚合:CTR = click_count / show_count,分别维护分子分母的滑动窗口计数即可增量;分桶统计可每桶一个滑动计数器。
- 实现:Flink/Spark Streaming 等提供窗口 API;自研可用「时间分段 + 段内计数 + 段过期删除」或 Roaring Bitmap 等做精确/近似 UV。
四、背压与一致性
- 流式需处理背压(下游慢时反压上游);语义上区分 at-least-once 与 exactly-once,按需选幂等与状态持久化。
面试要点
- 能说清实时指标的流式计算、滑动窗口的类型与含义。
- 能说明增量更新:计数与 sum 的进窗/出窗、UV 的近似结构、CTR 等比率的维护;能简述实现(分段、HLL、Flink 等)。
记忆要点
- 实时指标:流式计算+滑动窗口;增量=进窗加、出窗减;UV 用 HLL 等近似。
- CTR 等=分子分母分别滑动计数;实现可用分段或流式引擎(Flink)窗口 API。