2 清洗:6 步检查
结论:每条事件依次过 6 步检查,50 ms 内写入画像库;不通过的事件带着原因码丢弃。
丢弃的意思只有一个:事件进隔离区,保留 7 天,不进画像库。
flowchart TD
S1["1 链接"] --> S2["2 字段"]
S2 --> S3["3 迟到"]
S3 --> S4["4 无效流量"]
S4 --> S5["5 去重"]
S5 --> S6["6 统一字段"]
S6 --> C[("画像库")]
S1 -. "unknown_link / disabled_link / bad_sig" .-> Q["隔离区 7 天"]
S2 -. "invalid_field:字段名" .-> Q
S3 -. "late" .-> P["只进报表"]
S4 -. "ivt" .-> Q
S5 -. "duplicate" .-> Q
S6 -. "no_device_key" .-> Z["频次按 0 计"]
| 步骤 | 检查 | 原因码 | 不通过时 |
|---|---|---|---|
| 1 链接 | 链接存在、已启用、签名正确 | unknown_link / disabled_link / bad_sig | 进隔离区 |
| 2 字段 | imp_id 有值且不是未替换的宏;imp_time 是数字 | invalid_field:字段名(例:invalid_field:imp_time) | 进隔离区 |
| 3 迟到 | imp_time 距 received_at 不超过 300 s | late | 只进报表,不更新用户卡片,不算丢弃 |
| 4 无效流量 | UA 不为空且不是爬虫;IP 和设备键没超过限流 | ivt | 进隔离区 |
| 5 去重 | 同一链接、同一 imp_id,24 小时内只算一次 | duplicate | 进隔离区 |
| 6 统一字段 | 时间统一为毫秒;取设备键 | no_device_key | 照常进报表;频次按 0 计 |
去重键和窗口
imp_id 是曝光的去重键,点击的去重键是 click_id。窗口是 24 小时。腾讯重发同一个 imp_id,只算一次。全站只在这里定义。
设备键
设备键就是“这台手机的编号”。我们按顺序取第一个有值的:OAID(安卓广告编号)、IDFA(苹果广告编号)、CAID(国内 iOS 替代编号)、MUID(腾讯给的编号)。频次和归因都按它算。没有设备键的事件记为 no_device_key(无设备键)。
哈希规则:腾讯给的编号已经是 MD5 哈希,直接用,不再哈希一次。ADX 给的是原始编号,按腾讯同样的方法哈希一次(同样的大小写和格式),再拿去比。这样同一台手机两边得到同一个设备键。
其他规则
| 规则 | 做法 |
|---|---|
| 幂等 | 同一事件收到两次,结果和收到一次一样。 |
| 背压 | 队列积压时,接收端仍在 10 ms 内返回 204,事件先进队列。积压超过 1 s 告警。 |
| 期望字段 | 链接可以设置期望字段(例如必须带 OAID)。缺少时事件照常通过,但在监控里标为 unexpected:字段名。 |
字段级原因码参照 Mixpanel Import API 的 strict 模式:每条失败记录都写明是哪个字段出错。