了解何时选择蓝/绿或金丝雀发布、流量切换如何工作、需要监控哪些指标,以及用于更安全发布的实际放量与回滚步骤。

发布新代码存在风险,原因很简单:直到真正的用户开始使用,你才会知道它如何在真实环境中表现。蓝/绿和金丝雀是两种常见的方式,用来在将停机时间降到最低的同时降低风险。
蓝/绿部署使用两个独立但相似的环境:
你在后台准备 Green 环境——部署新构建、运行检查、预热——当你有把握时再把流量从 Blue 切到 Green。如果出现问题,可以迅速切回。
关键不是“两个颜色”,而是一个干净且可逆的切换。
金丝雀发布是逐步放量。不是一次性把所有人切过去,而是先把新版本发给一小部分用户(例如 1–5%)。如果一切正常,逐步扩大直到 100% 的流量都在新版本上。
关键是在全面迁移前从真实流量中学习。
这两种方法都是为达成以下目标的部署策略:
它们通过不同方式实现这些目标:蓝/绿侧重于环境间的快速切换,而金丝雀侧重通过流量切换进行受控曝光。
两者都不是绝对优越。正确的选择取决于产品如何被使用、你对测试的信心、你需要多快得到反馈,以及你想避免哪类故障。
很多团队也会混合使用——在基础设施上用蓝/绿保持简单性,同时对用户曝光采用金丝雀技巧。
在接下来的章节中,我们将直接比较它们,并说明各自通常适合的场景。
蓝/绿和金丝雀都是在不打断用户的情况下发布更改的方法,但它们在如何把流量切到新版本上有所不同。
蓝/绿运行两个完整环境:“Blue”(当前)和“Green”(新)。你验证 Green 后,一次性把所有流量切过去——就像翻动一个受控的开关。
金丝雀先把新版本发给一小部分用户(例如 1–5%),然后在观察真实表现的同时逐步增加流量。
| 因素 | 蓝/绿 | 金丝雀 |
|---|---|---|
| 速度 | 验证后切换非常快 | 按设计较慢(分阶段放量) |
| 风险 | 中等:切换后若有问题会影响所有人 | 更低:问题常在全面放量前暴露 |
| 复杂度 | 中等(两个环境,干净切换) | 更高(流量分配、分析、分阶段) |
| 成本 | 更高(放量期间需双倍容量) | 往往更低(可利用现有容量分阶段放量) |
| 适用场景 | 大规模、协调性强的变更 | 频繁的小改进 |
当你想要一个干净、可预测的切换时选择蓝/绿——尤其适用于大型变更、迁移或需要“旧版 vs 新版”明确隔离的发布。
当你经常发布、希望从真实使用中安全学习,并通过指标引导每一步以降低影响面时选择金丝雀。
如果不确定,可以先用蓝/绿以获得操作简单性,然后在监控和回滚流程成熟后对高风险服务加上金丝雀。
当你希望发布像“翻开开关”的感觉时,蓝/绿是个强有力的选择。运行两个接近生产的环境:Blue(当前)和 Green(新)。当验证 Green 无误后把用户路由过去。
如果你的产品无法忍受可见的维护窗口——比如结账流程、预订系统、登录仪表盘——蓝/绿很合适,因为新版本会先启动、预热并检查完毕,在把真实用户导过去之前完成大部分“部署时间”。
回滚通常就是把流量路由回 Blue。这在以下场景很有价值:
关键好处是回滚不需要重建或重新部署——只是一次流量切换。
当数据库迁移向后兼容时,蓝/绿最容易实施,因为短期内 Blue 和 Green 可能同时存在(并可能都进行读写,取决于路由和任务设置)。
合适的情况包括:
不适合的情况包括删除列、重命名字段或就地改变字段含义——这些会破坏“切回”承诺,除非你设计了多步迁移策略。
蓝/绿需要额外容量(两套栈)和能控制流量的手段(负载均衡、Ingress 或平台路由)。如果你已有自动化来准备环境并有清晰的路由手段,蓝/绿会成为高信心、低戏剧性的默认选择。
金丝雀发布是把更改先发布给一小部分真实用户、观察结果并再扩展的策略。当你想在不全局停止的情况下降低风险时,它非常合适。
金丝雀最适合高流量应用,因为即便 1–5% 的流量也能很快产生有意义的数据。如果你已经监控清晰的指标(错误率、延迟、转化、结账完成率、API 超时),就可以用真实使用来验证发布,而不是仅依赖测试环境。
有些问题只有在真实负载下才会出现:慢数据库查询、缓存未命中、地区延迟、罕见设备或少见的用户路径。通过金丝雀你可以在向所有人推广前确认是否有错误或性能退化。
如果你的产品发布频繁、由多个团队共同贡献,或包含可以逐步引入的更改(UI 调整、定价实验、推荐逻辑),金丝雀发布很自然。你可以按 1% → 10% → 50% → 100% 的顺序扩展,视观察结果而定。
金丝雀与功能开关配合效果尤其好:你可以先安全地部署代码,然后对一部分用户启用功能、对另一部分不启用。回滚通常不需要重新部署——只需关掉开关即可。
如果你在朝渐进式交付发展,金丝雀通常是最灵活的起点。
参见:/blog/feature-flags-and-progressive-delivery
流量切换就是控制谁在什么时候看到新版本。不是一次性把所有人切走,而是逐步或有选择地把请求从旧版本迁移到新版本。这是蓝/绿部署和金丝雀发布的实践核心,也是实现零停机部署的关键。
你可以在堆栈的几个常见点进行流量切换。选择取决于你现有的架构以及你需要多细粒度的控制:
你不需要每一层都用上。选择一个作为路由决策的“单一真实来源”,这样你的发布管理就不会变成一堆猜测。
大多数团队使用以下一种或多种方法进行流量切换:
百分比分配最容易说明,但分群通常更安全,因为你可以控制哪些用户看到更改(并避免在首小时惊扰重要客户)。
两个常见问题经常破坏看似靠谱的发布计划:
粘性会话(session affinity)。 如果系统把用户绑定到某台服务器/版本上,10% 的流量分配可能并不等同于 10% 的用户。这也会在用户在会话中在版本间切换时引发混淆性错误。若可能,使用共享会话存储或确保路由保持用户在同一版本上。
缓存预热。 新版本常会遇到冷缓存(CDN、应用缓存、数据库查询缓存),这可能看起来像性能回退,即使代码本身正常。放量前规划好预热时间,尤其是高流量页面和昂贵端点。
把路由变更当作生产变更来处理,而不是随手一按的按钮。
记录清楚:
这点治理可以防止好心人“顺手把比例调到 50%”时,其他人还在观察金丝雀是否健康。
发布不是“部署成功了吗?”而应问“真实用户的体验是否变差?”在蓝/绿或金丝雀发布中保持冷静的最简单方法是监控一小组能告诉你系统是否健康、变更是否伤害用户的信号。
错误率:监控 HTTP 5xx、请求失败、超时和依赖错误(数据库、支付、第三方 API)。一个看似“小”的错误率上升也会带来大量客服工单。
延迟:观察 p50 和 p95(如果有 p99 更好)。平均延迟稳定并不代表长尾延迟不存在,后者会直接影响用户感受。
饱和度:观察系统资源“饱和”程度——CPU、内存、磁盘 IO、数据库连接、队列深度、线程池等。饱和度问题通常比完全宕机更早地显现。
用户影响信号:衡量用户实际体验——结账失败率、登录成功率、搜索结果返回率、应用崩溃率、关键页面加载时间。这些常常比单纯的基础设施指标更有意义。
创建一个能在单屏显示的仪表盘,并在发布渠道共享。每次发布保持一致,这样就不用浪费时间找图表了。
包括:
如果你做金丝雀发布,把指标按版本/实例组分割,这样可以直接对比金丝雀与基线。对于蓝/绿部署,在切换窗口内比较新旧环境即可。
在开始切流之前就决定规则。示例阈值可能是:
具体数值取决于你的服务,但关键是提前达成一致。若每个人都知道回滚计划和触发条件,就能避免在客户受影响时发生争论。
在发布期间增加(或临时收紧)告警:
让告警具有可执行性:"发生了什么变化,在哪里,下一步做什么"。如果告警太吵,关键时刻人们会忽略真正重要的信号。
大多数发布失败不是由“大错误”直接导致,而是由小不匹配引起:缺失配置、错误的数据库迁移、过期证书或在新环境中表现不同的集成。发布前检查能在影响面还很小的时候把这些问题捕获。
在切任何流量之前(无论是蓝/绿切换还是小比例金丝雀),确认新版本基本存活并能处理请求。
单元测试很好,但不能证明部署后的系统在真实环境中可用。对新环境运行一套短小的自动化端到端测试,最好能在几分钟内完成。
关注跨服务边界的流程(Web → API → 数据库 → 第三方),并至少对每个关键集成运行一次“真实”请求。
自动化测试有时会漏掉明显的问题。对核心工作流做有针对性的人为验证:
如果支持多种角色(管理员 vs 客户),至少抽样每种角色的一个旅程。
把经验转成可复用的清单,保持简短且可执行:
当这些检查成为常规,流量切换就变成受控步骤,而不是一次冒险的飞跃。
把蓝/绿发布视为一份检查清单来执行:准备、部署、验证、切换、观察、清理。
把新版本发布到 Green 环境,Blue 继续为真实流量服务。确保配置和 secrets 对齐,使 Green 成为真实的镜像环境。
先做快速高信号的检查:应用能正常启动、关键页面能加载、支付/登录可用、日志无异常。如果有自动化烟雾测试,现在运行它们。同时验证 Green 的监控仪表盘和告警是否可用。
当数据库发生变化时蓝/绿会变得复杂。采用扩展/收缩策略:
这样就避免了“Green 能工作但切回后 Blue 无法运行”的情况。
在切流前预热关键缓存(首页、常见查询),以免用户承受“冷启动”成本。
对于后台作业/定时任务,决定谁来执行:
翻转路由把流量从 Blue 切到 Green(负载均衡/DNS/ingress)。观察错误率、延迟和业务指标的短期窗口。
做一次仿真真实用户的抽查,然后短时间内保留 Blue 作为回退选项。一旦确认稳定,停用 Blue 的任务、归档日志并释放 Blue 以降低成本与混淆。
金丝雀发布的核心是安全学习。不是一次性把所有用户都迁移,而是先给一小部分真实流量,密切观察,再扩展。目标不是“放得慢”,而是“用证据逐步证明安全”。
与当前稳定版本并行部署新版本。确保你可以把定义的百分比流量路由到新版本,并且两个版本都在监控中可见(分开的仪表盘或标签会很有帮助)。
从极小的比例开始。这个阶段通常能快速发现明显问题:端点故障、缺失配置、数据库迁移意外或延迟激增。阶段中记录:
如果第一阶段无异常,增加到约四分之一流量。此时你会看到更多的“真实世界”多样性:不同的用户行为、长尾设备、边缘案例和更高并发。
半数流量能让容量与性能问题更清晰地暴露。如果有扩展瓶颈,通常会在此阶段出现早期警告信号。
当各项指标稳定、用户影响在可接受范围内时,把所有流量切到新版本并宣布升级完成。
放量时间取决于风险和流量量级:
还要考虑业务周期。如果产品存在流量高峰(比如午餐时间、周末、计费时段),让金丝雀覆盖这些条件,以更全面地验证。
手动放量会带来犹豫与不一致。尽可能自动化:
自动化并不取代人工判断,但能消除延迟。
每步放量都写下:
这些记录会把你的发布历史转化为下一次发布的指南,并让未来的事件排查更容易。
回滚在你事先决定什么是“坏”的并明确谁有权按下按钮时才会变得容易。回滚计划不是悲观,而是防止小问题发展成长期中断的办法。
选一份简短的信号清单并设置明确阈值,避免事件中争论。常见触发器包括:
把触发器量化(例如 “p95 > 800ms 持续 10 分钟”),并把责任人(值班、发布经理)与直接行动权限绑定。
速度比优雅重要。你的回滚应当是下列之一:
避免把“先做人工修复再继续放量”作为首选动作。先稳住,再调查。
在金丝雀发布中,某些用户可能已经在新版本下创建了数据。提前决定:
稳定后写一份简短的事后说明:触发回滚的原因、缺失哪些信号、下次发布要改进的清单。把它当作发布流程的产品改进循环,而不是找责任人。
功能开关让你把“部署(deploy)”与“发布(release)”分离。这很重要,因为你可以用相同的部署管道(蓝/绿 或 金丝雀),通过一个开关来控制曝光。
有了开关,即便功能尚未对所有人开放,你也可以合并并部署代码。代码存在但处于休眠状态。当你有把握时,可以逐步启用该开关——通常比推新构建要快;若出问题,也可以快速关掉。
渐进式交付是有计划地增加访问范围。开关可以针对:
当金丝雀告诉你新版本健康,但你仍想把功能风险单独控制时,这非常有用。
功能开关很强大,但需要治理:
一条实用规则:如果有人无法回答“关掉这个开关会发生什么?”,说明这个开关还不够成熟。
关于把开关作为发布策略一部分的更深入指导,参见 /blog/feature-flags-release-strategy。
在蓝/绿与金丝雀之间选择不是“哪个更好”的问题,而是你想控制哪种风险,以及在现有人力与工具条件下你能实际做到什么。
如果你的首要目标是干净、可预测的切换且要有容易回到旧版本的按钮,蓝/绿通常最简单。
如果你的首要目标是减小影响面并在更广泛推广前从真实流量学习,且你经常发布或难以事先完全测试,金丝雀通常更安全。
一个务实的规则:选择你能在凌晨两点也能稳定运行的一种方法。
挑一个服务(或一个面向用户的工作流)作为试点,运行几次发布。选择重要但不是决定性命运的目标,目的是培养关于流量切换、监控和回滚的操作习惯。
保持简短——一页就够:
确保任务归属明确。没有负责人,策略只会变成建议。
在引入新平台前,先看看你已有的工具:负载均衡配置、部署脚本、现有监控与事故流程。只有当新工具能切实消除你在试点中遇到的摩擦时,才引入它们。
如果你在快速构建与交付新服务,集成应用生成与部署控制的平台也能减少运维成本。例如,Koder.ai 是一个让团队通过聊天界面生成 Web、后端与移动应用的平台,并支持部署与托管,提供像快照与回滚、定制域名和源代码导出的实用安全特性。这些能力契合本文的核心目标:让发布可重复、可观测且可逆。
若想查看实现选项与支持的工作流,请审阅 /pricing 和 /docs/deployments。然后安排你的首次试点发布,记录哪些做得好,逐次迭代你的运行手册。