外观
ADS / 服务层出数怎么验收再发布
难度与前置
难度:进阶
前置:知道 ADS 是给人看的出口层;理解 READY ≠ 任务成功。
读完能做什么:给日报 / API 定「可发布」门禁,用对账与灰度避免半份数据上线,并能量化回滚。
适用场景
- 新 ADS 表或改口径后要进看板 / 对外 API
- 经常「任务绿了但业务说数不对 / 缺渠道」
- OLAP / 服务层同步后直接开放查询,缺少发布步骤
不适用:
- 纯探索型临时取数(不进正式出口)
- 实时秒级看板的流式发布(另见实时域;原则可借鉴,SLA 不同)
真实场景(一条)
投放运营日报 ADS 改口径(不含赠款)。工作流 SUCCESS,同步 OLAP 也绿,业务 09:35 打开看板发现头部渠道少 8%。
根因:
- 发布只看「同步任务成功」,未做与旧口径 / 渠道对账
- 查询视图立刻切到新表,无灰度
- 回滚要改数仓 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门禁最少三项(可按表加减):
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 行,否则禁止 publish3. 用版本化发布,不要「原地覆盖唯一出口」
推荐:
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 星型,不改变发布门禁本身
常见坑(至少这些)
SUCCESS 即开放查询
半份分区、错日分区照样进看板。出口与口径字典脱节
看板 SQL 私改公式,对账永远对不齐。无版本、只能重跑回滚
重跑要数十分钟,业务窗口已过。灰度只看技术指标
忽略业务抽检(头部渠道、大额活动日)。门禁 SQL 扫全历史
发布变慢;门禁应限在当次dt/ 变更范围。多出口各切各的
看板切了、API 没切,对外口径分裂。
如何验收(带数字的前后对比)
| 指标 | 改前(示例) | 改后(目标) |
|---|---|---|
| 「绿勾但错数」进正式出口次数 / 月 | 如 ≥ 2 | 0(挡在门禁) |
| 回滚耗时 | 如 > 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
改写说明:服务层发布门禁与灰度,链到分层 / 调度 / 对账 / 口径 / 云上原则;无未公开公司数据。