FDE·交付知识库
目录
需求诊断 项目切片 灰度上线 验收交接 报价期望 集成治理

模块 07 · 灰度上线

一句话:灰度不是「小心一点地上线」,是用小范围失控换取大范围的稳定。上线前把风险量清楚,比上线后祈祷顺利有用一万倍。

项目锚点 · 4 家经销商门店灰度 + LumenX 482 次重启的反面教材

上线节奏:第 1 周 1 家经销商门店 → 第 2 周 2 家 → 第 3 周 4 家 → 第 4 周全量。为什么不能一次全上:LumenX 平台近 2 天 pm2 重启 482 次(约 6 分钟一次),这种稳定性下全量上线就是灾难。

回滚预案里最容易翻车的是数据兼容——代码回滚了但数据已经写进去。延伸:模块 12 · 稳定性与监控、基础 17 · 并发锁事务。

01

为什么绝不能一次全上

先讲一个我自己踩过的反面例子,就明白「全量上线」在什么状态下等同于灾难。

LumenX 平台(部署在 124.222.108.196)当时的状态是:近2 天内 pm2 重启 482 次——平均每 6 分钟崩一次。在这个稳定性下把系统推给全部用户,等于把客户的日常经营押在一个每6 分钟重启一次的服务上。

如果全量上线会发生什么
用户正在录单每 6 分钟被踢出去一次,正在填的订单内容全丢
问题出在 P1 引擎但用户看到的是整个页面打不开,分不清是谁的锅,注意力全在「这系统不能用」
你想回滚回滚代码需要时间,而这 6 分钟一轮的重启可能在你操作之前又崩了一次
客户信任一次就毁了,后面再说什么「这是灰度阶段」都没人信
结论:在稳定性没有达标之前全量上线,不是勇敢,是把不可控的风险一次性推给最没有准备的人。先量风险,再放量——顺序反了,做得越多,错得越大。
灰度的真正价值:它不是让你「更安全地上线」,是给你一段可以犯错的时间。全量上线只有一次机会,错了就是客户直接受损;灰度有四道,每道都能拦住一部分问题。这也是为什么灰度期一定要每天核对——不核对的灰度等于没灰度,只是把风险延后了。
02

试点怎么选

德莉玛的灰度范围是4 家经销商门店。选哪 4 家,不是随便挑,也不是挑关系最好的。

最常见的选错方式:挑最配合的那家。最配合的门店数据规整、反馈积极、店长懂电脑——你在它上面跑通了,换一家真实的门店照样崩。试点要选「最像大盘的」,不是选「最好的」,也不是选「最差的」。

试点应满足的条件为什么
业务结构像大盘接的订单类型、经销商数量、型号种类要接近全量比例。如果试点门店只做标准品,测不出异形单的坑
店长/一线愿意配合但不特殊照顾要有反馈意愿,但不能额外培训。试点要验证的是「产品能不能让一线自己用起来」,一上手就配人教,就测不出真实可用性
有可对照的历史数据能用它过去的单据量、返工记录做基线,否则放量后你无法证明「有没有变好」
出问题时能被隔离这家门店的数据和操作不能影响其他门店;出问题后业务能退回原来的流程继续跑,不至于停摆
4 家门店怎么分工:不要 4 家同步上。建议 1 家先跑、确认稳定后再开第 2 家、然后 2 家一起——这样你永远有「一组已知正常」作对照,出问题时能立刻判断是新开的那家的问题还是系统本身的问题。
选最像大盘的,不选最配合的不给试点额外培训,否则测不出真实可用性必须能退回旧流程
03

灰度四步 + 放量节奏表

1

定观察指标(上线前就定死)

这一步必须在写代码之前做完。指标分两类:技术指标(错误率、响应时间、进程重启次数)和业务指标(单据量、返工率、录入耗时)。两类都要,理由见下一节。指标没定就上线,等于没有上线标准,只能凭感觉说「还行」。

2

小范围放开(1 家先跑)

只开 1 家经销商门店。放出的是完整可用的功能,不是半成品——半成品会让一线形成错误习惯,后面改起来更痛。同时必须准备好随时回滚的动作,不是「到时候再说」。

3

每日核对(不能漏,这是灰度的核心动作)

每天固定时间对一次账:技术侧看错误率/响应/重启次数,业务侧看单据量和录入耗时。连续 3 天各项指标稳定,才允许进入下一步放量。只跑一天就放量,是把灰度当形式。

4

逐步放量(每一步都留观察期)

按下面的节奏表推进。每一档之间都要留出观察期,出问题的第一步动作永远是回滚,不是修——线上时间比修复时间贵得多。

放量节奏表

时间范围进入下一档的条件
第 1 周1 家经销商门店连续 3 天技术指标无异常 + 一线能独立完成完整单据
第 2 周2 家经销商门店业务指标不低于旧流程基线,且返工率无上升
第 3 周4 家经销商门店(全部试点)数据核对无差异,录入耗时相比旧流程确有下降
第 4 周全量放开回滚预案仍保持可用,且已实测过一次完整回滚
为什么第 4 周才全量:因为试点只有 4 家,覆盖不了全量的异形场景。第 3 周跑完能证明「结构上没问题」,但第 4 周放开仍要盯着指标——全量不是终点,是观察对象变多了,监控不能撤。
04

观察指标怎么定

只看「功能能不能点开」是灰度里最典型的自欺欺人。功能全都能点,流程照样走不通——单据量没涨、录入耗时没降、返工率反而更高,系统就是个摆设。

技术指标业务指标
看什么页面错误率、接口响应时间、进程重启次数单据量、返工率、录入耗时
谁关心开发本人客户方店长、一线员工
说明什么系统稳不稳。进程重启次数是最硬的信号——它只要在涨,就说明系统还没到能全量的水平系统有没有真的被用起来、有没有让人干活更快
容易骗人吗容易。页面看着正常、后端悄悄重启,你只看页面发现不了不容易。这是一线每天的真实体感,骗不了人
判断原则:技术指标决定「能不能继续放量」,业务指标决定「值不值得放量」。技术指标达标但业务指标没改善,说明做出来的东西不是一线要的——这时候该回去改功能,而不是继续放量。业务指标才是最终答案,技术指标只是门槛。
05

回滚预案(硬性要求)

回滚不是「出问题再说」,是上线前就写好、上线前就演练过的东西。这一节没有商量余地。

一、回滚触发条件:写死,不讨论

下面这些条件任一命中,立刻回滚,先恢复业务再讨论原因。现场讨论「再观察一下」是事故扩大的标准动作:

触发条件为什么不容讨论
一线无法完成一笔完整单据业务停摆是最大的事故,其他问题都可以等
数据核对出现差异(且无法当场解释)数据错了继续跑,错的数据会扩散到更多门店,回溯成本翻倍
错误率高于旧流程基线说明新系统比原来还差,继续放量是放大损失
进程重启次数持续上涨参照 LumenX 那 2 天 482 次的前例,这是稳定性已经崩了的信号

二、回滚动作步骤

1

停止入口,优先保住正在操作的人

先把用户挡在流程外,别让半截数据继续写进来。

2

确认要退到哪个版本

必须是已知可用的上一个版本,不是「最近一版」。上线前就把上一个版本固定下来并留好包。

3

执行回滚

目标是1 小时内恢复。这是对 MVP 判定标准第 3 条的兑现动作。

4

通知所有使用者,说清当前能做什么

说清现在该走哪条流程。不要让人对着一个回滚后的页面自己猜。

5

查清原因,再决定要不要重新放量

原因没查清之前不重新放开。急着「再试一次」是同一个坑踩两遍。

最容易翻车的点:数据兼容怎么办。

代码能退,已经写进去的数据退不回去。你回滚了代码,但灰度期那 3 天里新系统写进库里的单据、匹配结果、拆单工单还留在表里。这时候旧代码上来,它根本不认识这些新结构的数据,轻则页面报错,重则静默算错——旧引擎把新字段当成空值,算出一个看起来正常的错误结果。

所以数据兼容必须在放量前就处理完,三种做法选一种并写进预案:
①向前兼容——让旧代码也能正确处理新字段(改造成本高,但最稳)
②灰度数据隔离——灰度写独立表/独立库,全量前整体迁移一次(改动可控,最常用)
③停机窗口清库——回滚同时清掉灰度期数据,从旧流程重新开始(损失可控,但前面几天的工作作废)

没有处理数据兼容的方案,就不允许放量。「先回滚代码,数据问题回头再修」是最常见的、也是最贵的错误。
06

常见坑 / 红线

坑表现 / 对策
只测 happy path演示的时候一切正常,一线真实用起来处处是坑:单据类型不全、型号是异形、尺寸缺失、经销商重复下单。对策:测试用例必须来自真实历史数据里的「脏样本」,尤其是那 400 单里没尺寸的那类场景
把灰度当责任转移出了问题第一反应是「这是试点的问题」「他们不按规范用」。对策:灰度期的目标是发现问题,发现问题是成功的,不是甩锅。找原因的方法是查数据和流程,不是查人态度
灰度期没做回滚演练预案写得很漂亮,真出事时发现回滚脚本跑不通、备份取不到。对策:放量前真的退一次,把时间记下来。演练过一次的回滚,和没写过的回滚,是两种东西
指标只看技术侧页面全正常、单据量零增长,还以为灰度成功。对策见第 04 节:业务指标才是最终答案
放量节奏抢时间「第2 周看起来没问题,提前全量吧」。往往是没观察到第 3 周才暴露的差异。对策:观察期一天都不压缩,出问题就退到上一档而不是全量
试点店被特殊照顾派专人常驻、单独开小灶、提前补好数据。灰度效果全部失真。对策:试点要有,但不迁就
红线:回滚演练没做过、数据兼容方案没定,不要开始放量。这两项是灰度里唯一不能靠运气通过的条件。
✓

自查清单

  • ✓我能讲清 LumenX 近 2 天 pm2 重启 482 次(约每 6 分钟一次)这个反面案例,并说明它为什么让全量上线变成灾难
  • ✓我选试点时会选「最像大盘的」门店,而不是最配合或关系最好的
  • ✓4 家经销商门店的放量节奏是第1 周 1 家 / 第 2 周 2 家 / 第 3 周 4 家 / 第 4 周全量
  • ✓观察指标同时包含技术指标和业务指标,且在写代码之前就定死了
  • ✓灰度期我每天核对,且连续 3 天稳定才允许放量
  • ✓回滚触发条件是写死的,不现场讨论「再观察一下」
  • ✓我知道回滚代码退不回数据,并且已经选定一种数据兼容方案
  • ✓放量前我真的实测过一次完整回滚
面试怎么答

「讲讲你负责过的一次上线。」

我的思路是先量风险再放量。上线不是把东西推出去就完事,是分四步走的:定观察指标 → 小范围放开 → 每日核对 → 逐步放量。每一步都有进入下一步的条件,不达标就停在那儿,甚至退回上一档。

我负责的是德莉玛的灰度上线,范围是 4 家经销商门店。选这 4 家的时候我有个原则:不选最好的也不选最差的,选最像大盘的。因为最配合的门店数据规整、店长懂电脑,在它上面跑通了,换一家真实门店照样会崩。而且试点不做额外培训——一上手就配人教,测出来的就不是真实可用性了。

放量节奏是按周推的:第 1 周 1 家,第 2 周 2 家,第 3 周 4 家,第 4 周全量,每一档之间留观察期,连续 3 天各项指标稳定才允许往下走。指标我看两套:技术侧看错误率、响应时间和进程重启次数;业务侧看单据量、返工率、录入耗时。只看技术指标会骗自己——页面全正常、单据量零增长,系统就是个摆设。技术指标决定能不能继续放量,业务指标决定值不值得放量。

为什么这么谨慎,我有真实的反面例子:LumenX 平台部署在 124.222.108.196,近 2 天内 pm2 重启了 482 次,平均每6 分钟崩一次。在那种稳定性下把系统全量推给用户,等于让客户每天被踢出去几十次,正在填的单子全丢,用户还分不清是自己操作错还是系统崩了。所以我还把回滚做成了硬性要求:触发条件写死到不现场讨论,一步是在线不行的哪怕降级也不能让业务停;回滚目标 1 小时内恢复;最关键的一点——代码能退,数据退不回去,灰度期写进库的新字段旧代码不认识,静默算错比直接报错更危险,所以数据兼容方案必须在放量前定好,我选的是灰度数据隔离、全量前整体迁移。另外放量前我真的退回过一次,把耗时记下来,否则预案写得再漂亮也只是纸上的。