C.1 怎么用这份清单
这份清单不是发布流程的替代品,而是评审时的提问脚本。每一项都要求三样东西:证据、通过条件、失败后的回退动作。只勾“已完成”不算通过,必须能指出证据放在哪里、由谁维护、多久失效。
使用方式:
- 上线前由变更负责人逐项填写,不能填的标“不适用”并写理由;
- 评审人随机抽查三项,要求现场打开证据;
- 任何一项“无证据”且属于关键路径,暂停发布;
- 发布后 7 天内复核一次,确认证据仍然有效。
清单分六类,共 26 项。不是每次发布都要全跑:新增服务、拆分、跨租户变更、数据库迁移、重大流量活动应当全跑;日常小版本可以只跑标注“必查”的项。
发布类型与必查范围
| 发布类型 | 必查类别 | 可以简化 | 额外要求 |
|---|---|---|---|
| 日常小版本 | 契约、观测、发布 | 拆分、平台 | 保留回滚证据 |
| 新服务上线 | 全部六类 | 无 | 黄金路径与成本标签 |
| 服务拆分 | 拆分、契约、观测、发布 | 平台 | 回退单体路径演练 |
| 数据库迁移 | 契约、发布、观测 | 拆分、平台 | expand-contract 三阶段 |
| 跨租户/权限变更 | 租户、契约、观测 | 拆分、成本 | 越权测试与审计 |
| 重大流量活动 | 观测、发布、混沌 | 拆分、平台 | 容量与降级演练 |
这张表只决定“查哪些”,不降低单项标准。简化不等于免检:被简化的类别如果出现异常信号,应当立即升级为全查。
C.2 拆分与边界(4 项)
| # | 检查项 | 证据 | 通过条件 | 失败回退 |
|---|---|---|---|---|
| S-1 | 拆分触发条件成立 | 变更频率、资源曲线、故障影响面数据 | 至少一条触发条件有 30 天数据 | 暂缓拆分,先改模块边界 |
| S-2 | 共享数据有明确 owner | 数据所有权表、访问路径图 | 每个共享表只有一个写 owner | 保留同库事务,不强行拆 |
| S-3 | 跨服务调用有失败路径 | 超时、重试、降级、补偿的测试记录 | 注入下游失败后主流程可解释 | 回退到进程内调用 |
| S-4 | 拆分收益可验收 | 发布频率、故障恢复时间、单位成本基线 | 有拆分前后同口径对比计划 | 设定 90 天复核点,未达标则合并 |
S-1 的关键不是“想拆”,而是“有数据证明现在的边界在拖累变更”。S-2 最容易被跳过:拆服务不拆数据,等于把共享表变成分布式共享表,故障面只会更大。
C.3 契约与兼容(5 项)
| # | 检查项 | 证据 | 通过条件 | 失败回退 |
|---|---|---|---|---|
| C-1 | 变更通过兼容性检查 | schema diff 报告 | 无破坏性变更,或已走版本化 | 保留旧字段/旧版本 |
| C-2 | 消费者清单完整 | 注册表、调用量、抓包或日志 | 关键消费者全部登记 | 先补清单,再谈弃用 |
| C-3 | 弃用窗口已通知 | 通知记录、迁移截止日期 | 窗口覆盖最长发布周期 | 延长窗口,保留双写 |
| C-4 | 错误语义未改变 | 错误码表、契约测试 | 旧错误码语义保持不变 | 新增错误码,旧码兼容 |
| C-5 | 契约测试进入 CI(必查) | 流水线配置、最近一次结果 | 破坏性变更会使流水线失败 | 修复检查或回退变更 |
契约检查的核心不是“文档更新了没有”,而是“如果消费者不升级,会不会坏”。C-5 必须是真的会失败的门禁,不能是“生成报告供参考”。
C.4 观测与 SLO(5 项)
| # | 检查项 | 证据 | 通过条件 | 失败回退 |
|---|---|---|---|---|
| O-1 | 关键路径有端到端 SLI(必查) | SLI 定义、查询语句、看板 | 覆盖用户成功动作,不只服务 200 | 重定义 SLI,暂停以此门禁发布 |
| O-2 | 遥测字段符合语义约定 | 字段清单、样例日志/追踪 | trace_id、tenant_id、order_id 可关联 | 补字段后再上线 |
| O-3 | 告警能落到行动 | 告警规则、runbook、演练记录 | 每条告警有 owner 与处置动作 | 降级为看板,不触发呼叫 |
| O-4 | 错误预算与冻结规则已配置 | SLO 配置、冻结流程 | 预算低于阈值会自动阻止发布 | 人工冻结,补自动化 |
| O-5 | 变更与信号可关联 | 发布记录、变更 ID、追踪 | 给定时间窗口能定位变更 | 补变更事件,否则回退发布 |
O-1 是最容易“看起来有、实际没有”的一项。判断标准很简单:用户投诉时,能不能用这个 SLI 复现“用户确实失败了”。不能,就说明它测的是服务,不是用户。
C.5 混沌与发布(6 项)
| # | 检查项 | 证据 | 通过条件 | 失败回退 |
|---|---|---|---|---|
| R-1 | 发布制品可追溯 | 镜像/二进制摘要、构建记录 | 摘要与制品一一对应 | 禁止发布,重建制品 |
| R-2 | 金丝雀有指标门禁 | 控制器配置、最近一次记录 | 指标恶化会自动停止/回滚 | 改人工审批,缩短批次 |
| R-3 | 回滚演练过(必查) | 演练记录、耗时、数据校验 | 5 分钟内回到上一版本且数据可读 | 补演练,暂缓发布 |
| R-4 | 数据库变更按 expand-contract | 迁移脚本、阶段说明 | 旧版本仍可读写 | 回退迁移,恢复旧字段 |
| R-5 | 混沌实验有止损条件 | 实验计划、爆炸半径、停止开关 | 稳态被破坏时 1 分钟内停止 | 取消实验,先补保护 |
| R-6 | 演练结果有回归项 | 游戏日报告、修复工单 | 每个失败场景有 owner 和截止日期 | 不允许无 owner 的演练结论 |
R-3 是发布治理的分水岭。没有回滚演练的“回滚脚本”,和没有消防演练的消防通道差不多:存在,但没人知道能不能用。
C.6 租户与安全(4 项)
| # | 检查项 | 证据 | 通过条件 | 失败回退 |
|---|---|---|---|---|
| T-1 | 租户隔离级别与业务匹配 | 租户模型、隔离矩阵 | 高敏租户不共享可越权的存储 | 提升隔离级别或拒绝上线 |
| T-2 | 入口强制注入租户身份(必查) | 网关配置、越权测试 | 缺失租户头的请求被拒绝 | 关闭入口,修复注入 |
| T-3 | 服务身份最小权限 | 身份清单、授权策略 | 每个服务只拥有所需操作 | 收回多余权限 |
| T-4 | 密钥可轮换、审计完整 | 轮换记录、审计日志 | 轮换不需要停机,拒绝有记录 | 延长旧密钥前先补审计 |
T-2 必须在网关或统一入口做,不能依赖每个服务自己检查。只要有一个服务漏检,跨租户泄漏就会发生;而这类事故的修复成本远高于上线前的一次拒绝。
C.7 平台与成本(4 项)
| # | 检查项 | 证据 | 通过条件 | 失败回退 |
|---|---|---|---|---|
| P-1 | 新服务走黄金路径 | 模板记录、流水线配置 | 80% 以上新服务使用标准路径 | 不阻断,记录例外原因 |
| P-2 | 平台能力有采纳数据 | 使用统计、用户访谈 | 能说出谁在用、为什么不用 | 收敛能力,补用户旅程 |
| P-3 | 资源有 owner 标签(必查) | 标签清单、成本报表 | 关键资源 100% 有归属 | 未分摊桶封顶并指定处置人 |
| P-4 | 单位成本可计算 | 成本/订单、成本/租户 | 口径稳定,可按周对比 | 先统一口径,再谈优化 |
P-1 和 P-2 经常被误解为“平台团队的自嗨指标”。实际上它们回答的是:组织是否真的通过平台降低了交付成本,而不是又维护了一套工具。
C.8 一页式评审表
把上面的条目压缩成一页,评审时逐行确认。空白不等于通过,必须写“有证据/不适用/未通过”。
| 类别 | 关键项 | 结论 | 证据位置 | 负责人 |
|---|---|---|---|---|
| 拆分 | S-1、S-2、S-3 | |||
| 契约 | C-1、C-2、C-5 | |||
| 观测 | O-1、O-2、O-4 | |||
| 发布 | R-1、R-3、R-4 | |||
| 混沌 | R-5、R-6 | |||
| 租户 | T-1、T-2、T-4 | |||
| 平台成本 | P-1、P-3、P-4 |
评审结论只有三种:
- 通过:关键项全部有证据,非关键项有明确的不适用理由;
- 有条件通过:存在未验证项,但有回退动作、责任人和截止日期;
- 不通过:关键项无证据,或回退动作不可执行。
“有条件通过”不是免责,它必须带一个可验收的截止日期;到期未完成,下一次发布自动降为“不通过”。
C.9 证据留存
证据不需要统一格式,但必须满足四个条件:
- 可定位:评审人能在一个链接或一个目录里找到;
- 可复现:命令、输入、环境齐全,别人能重跑;
- 有时效:写明生成时间,超过 30 天的容量/演练数据需要重跑;
- 有责任人:每份证据有一个维护人,不能是“团队公共”。
建议的最小留存结构:
release-evidence/
<change-id>/
split/ 拆分评估与依赖图
contract/ schema diff、消费者清单、契约测试
observability/ SLI 查询、看板快照、告警规则
release/ 制品摘要、金丝雀记录、回滚演练
chaos/ 实验计划、止损记录、回归项
tenant/ 越权测试、身份与密钥审计
cost/ 标签报告、单位成本口径
review.md 一页式评审表与结论
这份目录不需要复杂工具,一个对象存储桶加命名规范就能做到。真正难的是坚持每次发布都留,而不是事后补。
C.10 常见错误
- 把清单当审批表。 清单的目的是暴露证据缺口,不是收集签字;签字齐全但证据缺失,比不做清单更危险。
- 关键项没有失败路径。 “必须通过”但没有“不通过怎么办”,评审会被迫放行。
- 证据只在个人电脑里。 人一休假就失效,等于没有证据。
- 演练记录只写成功。 没有失败场景和回归项的演练报告,不能证明系统能承受故障。
- 成本只做总量对比。 总量下降可能只是业务量下降;没有单位经济,无法判断架构是否真的变便宜。
- 清单一年不更新。 系统、团队和监管都在变,清单需要至少每季度复核一次。
C.11 发布后 24 小时复核
上线不是治理的终点。发布后 24 小时是信号最密集、也最容易被忽略的窗口;很多问题不会在发布当下暴露,而是在缓存过期、定时任务触发或流量高峰时出现。
| 复核项 | 观察窗口 | 通过条件 | 不通过动作 |
|---|---|---|---|
| 端到端 SLI | 24 小时 | 不低于发布前 7 天基线 | 触发回滚或降级 |
| 错误预算消耗 | 24 小时 | 燃尽率不超过 2 倍日均 | 冻结后续发布 |
| 延迟分位数 | 24 小时 | p99 不超过基线的 1.2 倍 | 定位新路径或回滚 |
| 数据一致性 | 首个对账周期 | 差异为 0 或有解释 | 启动补偿与人工核查 |
| 告警噪声 | 24 小时 | 新增告警不超过 3 条 | 调整阈值或删除规则 |
| 成本异常 | 24 小时 | 单位成本无显著上升 | 检查资源与调用量 |
复核不通过时,不要先争论“是否属于发布导致”。先确认回滚能否让指标恢复;如果能,回滚就是最便宜的诊断工具。回滚后再分析原因,比在故障中定位代码更安全。
C.12 与四卷的对应关系
这份清单不是孤立存在的,它把四卷的判断压成了发布时的检查项。
| 检查类别 | 主要来源 | 关键问题 |
|---|---|---|
| 拆分与边界 | 卷一第 3、4 章,卷四第 1 章 | 边界是否成立,回退路径是否存在 |
| 契约与兼容 | 卷一第 5 章,卷四第 2 章 | 消费者不升级会不会坏 |
| 观测与 SLO | 卷二第 10 章,卷四第 6、7 章 | 指标是否代表用户结果 |
| 混沌与发布 | 卷二第 9、13 章,卷三第 12 章,卷四第 8、9 章 | 失败是否被演练过 |
| 租户与安全 | 卷一第 10 章,卷四第 10 章 | 隔离是否在入口强制 |
| 平台与成本 | 卷一第 9 章,卷四第 11、12 章 | 能力是否被使用,成本是否可归因 |
带着这张表读四卷,会比按章节顺序读更容易建立联系:每一次发布,都是四卷结论的一次联合验收。
C.13 最小证据模板
如果团队还没有统一的证据目录,可以从下面这份模板开始。它不依赖特定工具,复制到任意文档系统即可使用。
变更编号:
变更摘要:
影响服务 / 租户:
计划发布时间窗:
回滚负责人:
[拆分]
触发条件与数据:
共享数据 owner:
回退路径与演练时间:
[契约]
兼容性检查结果:
消费者清单与调用量:
弃用窗口:
[观测]
SLI 定义与查询:
基线(发布前 7 天):
告警与 runbook:
[发布]
制品摘要:
金丝雀阶段与门禁:
回滚演练耗时:
[混沌]
实验场景与爆炸半径:
止损条件:
回归项与 owner:
[租户]
隔离级别与越权测试:
服务身份与权限:
密钥轮换记录:
[成本]
owner 标签覆盖:
单位成本口径:
未分摊比例与处置人:
评审结论:通过 / 有条件通过 / 不通过
未完成项与截止日期:
模板的价值在于暴露空白。任何一格写不出来,都对应一个尚未回答的治理问题;先补空白,再谈发布。
C.14 小结
这份清单把卷四的六类治理动作压成 26 个检查项,每项都要求证据、通过条件和回退动作。它的价值不在于“覆盖全面”,而在于把“我们觉得没问题”变成“我们能证明哪里没问题、哪里还没证明”。
上线治理的终点不是一张全部打勾的表,而是一个团队能在十分钟内说清:这次变更改了什么、影响谁、失败了怎么退、证据在哪。如果做不到,清单再长也只是形式。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。