题目重点:现有数据库中广告曝光信息可能有误;设计校验、纠正和按广告商汇总的流水线,明确没有独立证据就不能凭空纠错。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练版每次曝光有 eventId、advertiserId、campaignId、occurredAt、ingestedAt、schemaVersion;这些字段是为方案定义的契约,非题目给定字段。
- 系统另有不可变原始日志/投递回执作为核对依据;若只存在一份可能错误的数据库,没有第二证据,无法判定某行真伪。
- 汇总示例按 advertiser/campaign/UTC 天聚合有效曝光次数;计费有效性和时区口径须再问。
- 纠错以版本化修正事件保留审计,而不直接覆盖唯一原始事实。
解题路线
- 先和面试官确认错误来源:重复写、漏写、字段映射错、迟到、机器人流量还是计费规则变化;并指定能信赖的原始事件或第三方对账源。
- 采集层按 schema 校验、eventId 幂等和字段归一,把原始事件写 append-only 日志;异常进隔离表而非静默丢弃。
- 校准 worker 对数据库与可信源按 eventId/业务键做 join,产出差异:missing、duplicate、fieldMismatch、invalid。每个 correction 带原因、源版本和处理状态;需要人工审核的歧义单独排队。
- 聚合从‘已判定有效’的版本化事实流计算 advertiser/campaign/时间窗计数;迟到事件与撤销使用 upsert/retraction 更新物化结果,批量重算可从原始日志重放。
- API 提供按维度查询计数、数据新鲜度水位和差异审计;监控源到汇总的 reconciliation gap、重复率、迟到率、待处理异常、回填影响。
- 如果这套汇总参与广告计费,须另外定义账单冻结、版本锁定和补差流程;题目未明确计费语义,不把聚合等同财务结算。
手动走一遍
原始日志有 eventId=E 的一次有效曝光,数据库误写两行 E。去重后有效曝光数是 1,差异台账记录 duplicate;若数据库缺少 E,校准补入一条版本化事实并让该 campaign 的日汇总 +1。没有原始日志或其他可信证据时,系统只能标疑似异常,不能断言正确次数。
规模与取舍
若每天 N 条曝光,去重/校准按 eventId 预期 O(N) 状态处理,保留窗口 W 天所需键状态近 O(N_W);按 advertiser/campaign 热度分片但热点 campaign 可能需要局部聚合再合并。回填成本与受影响窗口的原始事件量成正比,需按来源保留期和 SLA 规划。
易错点与追问
容易失分的边界
- 只在疑似错误数据库上做 group-by,错误会原样传入汇总。
- 没有独立可信来源却承诺自动修正所有错误。
- 重复 eventId 与合法不同曝光混淆。
- 更正事实后不做聚合 retraction,日汇总仍旧。
- 把广告计费口径/错误类型当题目已给定。
继续深挖
- 可信日志本身也有丢失时,如何估计不确定性?
- 跨日迟到与 UTC/广告主时区如何对账?
- 重新处理历史一周数据时怎样避免重复叠加?
- 修正后财务账单已出,如何补差和审计?
