发布策略与回滚

发布不是「一键上线」,而是可控、可回滚的过程。发布策略决定新版本如何替换旧版本:蓝绿两套环境一键切换、金丝雀先给少量流量试水、滚动发布逐批替换实例。功能开关让功能与部署解耦,可渐进放量或紧急关闭。回滚预案数据兼容保证出问题能快速退回;发布检查清单事后复盘把发布变成可重复、可改进的流程。本章把这些串起来讲清楚。

一、发布策略:蓝绿、金丝雀、滚动发布

蓝绿发布(Blue-Green):准备两套完全一致的环境(蓝、绿),当前流量在蓝,新版本先部署到绿;验收通过后,将流量从蓝切到绿,绿变新生产,蓝可留作下次发布或回滚用。优点是一键切换、回滚也是再切一刀;代价是资源双倍,且切换是「全有全无」。

金丝雀发布(Canary):新版本只部署到少量实例或一小部分流量(如 5%),观察错误率、延迟等指标;没问题再逐步放量(20% → 50% → 100%)。出问题则只影响少量用户,可快速回切。适合大流量、高风险变更。

滚动发布(Rolling):不新增整批机器,而是在现有实例上逐批替换:先更新一部分节点,健康检查通过后再更新下一批,直到全部是新版本。资源占用小,但发布过程较长,且一段时间内新旧版本并存,需注意接口与数据兼容。

三种发布策略与发布流程示意
蓝绿 Blue-Green
两套环境,流量一刀切换。回滚即再切一刀。资源双倍,切换全有全无。
金丝雀 Canary
新版本先接少量流量,观察后逐步放量。风险可控,适合大流量与高风险变更。
滚动 Rolling
逐批替换实例,无额外整批机器。发布期长,新旧并存需注意兼容。
三种策略对比

二、功能开关与渐进发布

功能开关(Feature Flag / Feature Toggle):在代码里用配置或服务控制「某功能是否开启」,而不是靠「是否部署这段代码」。这样可以让部署发布解耦:代码先上线但功能关闭,需要时再打开;可按用户、地域、比例灰度放量;出问题可立即关掉开关而不必回滚整个版本。实现方式从简单(配置文件、环境变量)到平台化(专门的功能开关服务,支持按规则、百分比、AB 实验)。注意开关不宜过多,要有清理机制,避免长期遗留「死代码」。

渐进发布:结合金丝雀与功能开关,先对内部用户或 1% 流量开放,再按指标逐步放大,直到全量。这样既控制风险,又不必一次性切全部流量。

feature_checkout_v2 = true new_ui_percent = 10 beta_users = [id1, id2]

功能开关示例:按布尔、百分比、用户列表控制

三、回滚预案与数据兼容

回滚预案:发布前就要想好「如果新版本有问题怎么退」。包括:回滚触发条件(错误率、延迟、业务指标超过阈值)、谁有权执行具体步骤(切回蓝环境、金丝雀回切、滚动暂停并回滚已更新节点)、数据与配置是否要一起回退。蓝绿回滚通常是再切回旧环境;金丝雀是流量切回旧版本;滚动需要重新部署旧版本或从镜像/包回退。

数据兼容:发布与回滚都涉及数据与接口。数据库 schema 变更尽量向后兼容(加列不删列、先兼容新旧两版再弃旧);接口采用兼容性版本或渐进废弃。否则回滚时旧代码可能读不懂新数据、或新代码依赖了新字段导致回滚后仍报错。宁可多一步「兼容期」发布,也不要一次性做破坏性变更。

回滚与数据兼容要点

  • 发布前定义回滚条件、执行人、步骤与权限
  • 蓝绿/金丝雀回滚多为流量切回;滚动需回退实例或镜像
  • Schema 与接口保持向后兼容,避免回滚后数据/接口不兼容

四、发布检查清单与事后复盘

发布检查清单:把「发布前必做」固化成清单,减少遗漏。例如:变更说明与影响范围、回滚方案与负责人、依赖服务与配置就绪、监控与告警已就绪、数据库/缓存变更方案、发布窗口与通知、审批(如需要)。发布中:按步骤执行、记录时间点与操作人、观察核心指标。发布后:确认业务正常、关闭或调整金丝雀/开关、更新文档与 runbook。

事后复盘(Post-mortem):若发布导致故障或近故障,做一次非甩锅的复盘:时间线、根因、影响、已做改进与待办。重点在改进流程与系统,而不是追责个人。把复盘结论写进文档,同步给团队,并更新检查清单与回滚预案。

发布检查清单要点

  • 发布前:变更说明、回滚方案、依赖与配置、监控、审批
  • 发布中:按步骤执行、记录时间与操作人、观察指标
  • 发布后:确认业务、收尾开关/金丝雀、更新文档;若有故障则复盘

一句话: 发布策略蓝绿两套一刀切、金丝雀小流量试水再放量、滚动逐批替换。功能开关让部署与发布解耦,支持灰度与紧急关闭。回滚预案数据兼容保证能安全退回;检查清单复盘让发布可重复、可改进。

小贴士: 金丝雀放量时不要只看错误率,还要看延迟、业务转化等。有时「没报错但变慢」或「转化率掉」同样需要回切。

五、小结

发布策略:蓝绿(双环境一键切换)、金丝雀(少量流量再放量)、滚动(逐批替换)。功能开关:部署与发布解耦、灰度与紧急关闭。回滚:事先定好条件与步骤,注意数据与接口兼容。检查清单复盘:发布前中后固化步骤,故障后复盘改进。下一章进入DevOps 文化与 SRE 初探,从协作文化到 SLO、错误预算与自动化运维。