Cloud SWE · Onsite System Design

Apple Ads Click Aggregator:去重、窗口、归因与回填

从点击事件采集到 campaign 统计拆系统,明确事件 ID、窗口迟到、归因口径和准确性层级。

题目重点:从点击事件采集到 campaign 统计拆系统,明确事件 ID、窗口迟到、归因口径和准确性层级。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练版统计每分钟每 campaign 的有效点击数,客户端事件有唯一 click_id、campaign_id、user/session 与 event_time。
  • 先只做点击聚合,不默认它就是计费真相;若涉及预算扣减、欺诈过滤或展示归因,应单独定义强一致与审计规则。

解题路线

  1. 入口验证 campaign、身份/签名和事件 schema,写入可重放日志后确认;重试会重复送达,用 click_id 在明确保留窗口内去重。
  2. 按 campaign_id+时间桶分区聚合,存计数与水位;event_time 决定业务窗口,处理时间只用于延迟监控。迟到事件可更新可变窗口或入修正流,超过最终化期限按产品规则处理。
  3. 在线服务读预聚合近实时值,并标注截至时间/可能修正;批重算从原始事件对账形成历史权威数据。热门 campaign 热点可做分片局部计数再合并。
  4. 若‘点击’必须由先前 impression 归因,定义 impression_id、可归因窗口、跨设备与重复点击过滤;欺诈可异步判定并产生修正事件,不在技术方案里假装业务口径已定。
  5. 容量估算以峰值点击 QPS、平均事件字节、保留时长、活跃 campaign 基数和查询 QPS 展开;监控积压、去重率、迟到率、实时与批对账差。

手动走一遍

同一个 click_id 因网络超时发两次,只计一票;一条 12:01 的事件到 12:04 才到达,仍归 12:01 窗口,并在看板显示该窗口可能更新。若反欺诈后来判为无效,写一条可追溯撤销/修正而不是直接悄悄减计数。

规模与取舍

摄入/聚合对 E 条事件至少 O(E) 处理,活跃窗口状态约与 campaign×时间桶基数相关;精确去重状态还与保留窗口内独立 click_id 数相关。高峰与热点决定分区和内存预算,题目未明确数值。

易错点与追问

容易失分的边界

  • 把 at-least-once 队列说成天然不重复计数。
  • 用处理时间代替事件时间,离线/网络延迟扭曲分钟报表。
  • 没有去重保留期限与迟到策略,内存无限增长。
  • 把近实时估算值当可审计计费数据。
  • 未确认点击与展示归因、欺诈规则就给确定收入指标。

继续深挖

  • 同一 click_id 超过去重窗口重发会怎样?
  • 跨设备归因与隐私限制如何取舍?
  • 突发热门广告导致单分区热点怎样缓解?
  • 计费系统要求审计/回放时怎样保存原始事件和修正链?
✓已复制微信号!