Skip to content

ADS / 服务层出数怎么验收再发布 ​

难度与前置

难度:进阶
前置:知道 ADS 是给人看的出口层;理解 READY ≠ 任务成功。
读完能做什么:给日报 / API 定「可发布」门禁,用对账与灰度避免半份数据上线,并能量化回滚。

适用场景 ​

  • 新 ADS 表或改口径后要进看板 / 对外 API
  • 经常「任务绿了但业务说数不对 / 缺渠道」
  • OLAP / 服务层同步后直接开放查询,缺少发布步骤

不适用:

  • 纯探索型临时取数(不进正式出口)
  • 实时秒级看板的流式发布(另见实时域;原则可借鉴,SLA 不同)

真实场景(一条) ​

投放运营日报 ADS 改口径(不含赠款)。工作流 SUCCESS,同步 OLAP 也绿,业务 09:35 打开看板发现头部渠道少 8%。

根因:

  1. 发布只看「同步任务成功」,未做与旧口径 / 渠道对账
  2. 查询视图立刻切到新表,无灰度
  3. 回滚要改数仓 SQL,十分钟内完不成

改造后:门禁 SQL 通过 → 灰度 10% 流量 / 只读影子表 → 全量切视图;出问题切回旧版本视图。同日再演练,发现对账失败时看板仍读旧版,业务无感。

怎么做(步骤清单) ​

1. 先定「出口契约」 ​

每个对外指标 / 表写清:

字段示例
业务日口径账户时区日切 / UTC 日(只选一种)
含税 / 赠款 / 退款明确包含或排除
主键与粒度如 dt + channel_id
服务对象看板 A、API /v1/spend
SLA工作日 09:30 前可查询(见 调度依赖 SLA)

与 指标口径一致性 字典同源,禁止出口私自改公式。

2. 计算完成 ≠ 可发布 ​

text
ADS 分区写入成功(幂等 overwrite)
  → 质量 + 对账门禁
  → 标记 publish_candidate
  → 灰度 / 影子验证
  → 切换「当前发布版」(视图 / 路由 / 配置)
  → 写 published_at + version

门禁最少三项(可按表加减):

  1. 完整性:预期维度到齐(如渠道集合、小时集合)
  2. 一致性:与上游 DWS / 对账表 diff ≤ 阈值(见 对账)
  3. 新鲜度:ready_ts 在 SLA 前(见 新鲜度)
sql
-- 示意:与对账表金额 diff
SELECT
  a.dt,
  a.cost_amount AS ads_cost,
  r.cost_amount AS recon_cost,
  abs(a.cost_amount - r.cost_amount) / nullif(r.cost_amount, 0) AS diff_ratio
FROM ads_ad_daily_report_1d a
JOIN ads_recon_channel_1d r
  ON a.dt = r.dt AND a.channel_id = r.channel_id
WHERE a.dt = '${biz_date}'
  AND abs(a.cost_amount - r.cost_amount) / nullif(r.cost_amount, 0) > 0.001;
-- 期望:0 行,否则禁止 publish

3. 用版本化发布,不要「原地覆盖唯一出口」 ​

推荐:

text
ads_xxx_1d                -- 物理表,可按 dt 重跑
ads_xxx_1d_v20260926      -- 或按 version 分区 / 后缀
view ads_xxx_1d_current   -- 看板与 API 只读 current

切换 = 改视图定义或配置中心的 current_version,秒级回滚。

云上 OLAP 同步同样:先同步到候选表 → 校验 → 再切对外视图。原则见 云上通用原则。

4. 灰度最小集 ​

方式适用
影子表对比同 dt 新旧版并行算,只给内部看 diff
流量比例API 1%→10%→100% 切新版
只读白名单先开放给数据同学账号

灰度期盯:diff 行数、P95 查询、错误率、业务抽检清单。

5. 失败与回滚 ​

  • 门禁失败:不切 current;告警带缺失维度 / diff Top N
  • 灰度恶化:一键切回上一 current_version
  • 需要重算:走 补数与重跑,仍经门禁再发布

禁止:门禁失败仍「先上线再补」到正式出口。

6. 与分层的边界 ​

  • DWD/DWS 可以先 READY 给下游计算
  • 对人的出口(ADS / API / 看板)多一道 publish
  • 宽表 vs 星型选型见 宽表 vs 星型,不改变发布门禁本身

常见坑(至少这些) ​

  1. SUCCESS 即开放查询
    半份分区、错日分区照样进看板。

  2. 出口与口径字典脱节
    看板 SQL 私改公式,对账永远对不齐。

  3. 无版本、只能重跑回滚
    重跑要数十分钟,业务窗口已过。

  4. 灰度只看技术指标
    忽略业务抽检(头部渠道、大额活动日)。

  5. 门禁 SQL 扫全历史
    发布变慢;门禁应限在当次 dt / 变更范围。

  6. 多出口各切各的
    看板切了、API 没切,对外口径分裂。

如何验收(带数字的前后对比) ​

指标改前(示例)改后(目标)
「绿勾但错数」进正式出口次数 / 月如 ≥ 20(挡在门禁)
回滚耗时如 > 15 min(重跑)≤ 1 min(切视图)
发布前对账 diff未跑或偶发 > 1%≤ 约定阈值(如 0.1%)
P0 出口 SLA 达标率≥ 约定(如 95%)

Checklist:

  • [ ] 出口契约写在口径字典,与计算 SQL 同源
  • [ ] 门禁三项(完整 / 一致 / 新鲜)通过才进 candidate
  • [ ] current 可一键切回上一 version
  • [ ] 灰度或影子对比有记录
  • [ ] 看板与 API 绑定同一 current,无双轨私切
  • [ ] 无未公开项目名与内部账号写进文档
text
验收记录模板:
表 / API:
biz_date / version:
门禁结果(完整/一致/新鲜):
灰度方式与结论:
切换 current 时刻:
回滚演练耗时:
签字:

出口变更若涉及改表或改口径,先做 改表前影响评估,再走本篇门禁切 current。

相关面试题 ​

题库小程序链接待定;先用站内锚点占位。

  • [ ] 题:门禁三项通过前能否进 candidate?(考察点:完整/一致/新鲜)→ 占位:#todo-interview-ads-publish-gate
  • [ ] 题:如何验收 current 可快速回滚?(考察点:一键切回上一 version,回滚耗时目标)→ 占位:#todo-interview-ads-publish-rollback
  • [ ] 题:看板与 API 为何必须绑同一 current?(考察点:无双轨私切)→ 占位:#todo-interview-ads-publish-same-current
  • [ ] 题:改口径出口前还要先做什么?(考察点:先影响评估再门禁切 current;可链 lineage-impact)→ 占位:#todo-interview-ads-publish-impact

改写说明:服务层发布门禁与灰度,链到分层 / 调度 / 对账 / 口径 / 云上原则;无未公开公司数据。