从Google线上故障,谈灰度发布的重要性

简介: 2025年6月12日,Google Cloud因未灰度发布的配置导致全球服务中断7小时。根因是新功能缺乏错误处理,触发空指针异常,暴露了配置管理的重大风险。本文详解配置灰度发布策略,并以Nacos为例,介绍基于IP和标签的灰度实现方案,强调渐进式发布对系统稳定性的重要性。

引言

2025 年 6 月 12 日,Google Cloud 经历了一次重大故障,导致 Gmail、YouTube、Google 搜索、Google Cloud API 以及众多依赖其服务的互联网应用出现大规模中断。这次故障从太平洋时间 10:51 开始,直到 18:18 才完全解决,持续了约 7 小时 27 分钟。

根因分析

据 Google Cloud 发布的报告,此次故障产生的根本原因是一个新功能在没有经过充分测试和灰度发布的情况下被直接部署到生产环境,并且处理推送关键配置没有灰度过程。具体来说有以下几个环节:

故障引入:新功能部署

Google Cloud 为 Service Control 系统添加了一个新功能,用于配额策略检查。这个功能在没有经过充分测试和灰度发布的情况下被直接部署到生产环境。

设计缺陷:错误处理不足

新添加的功能缺乏适当的错误处理机制,特别是对于意外的空字段(blank fields)没有进行处理。根据 Reddit 上的信息,代码中存在致命缺陷:无法处理策略数据中的意外空字段。

故障触发:空指针异常

推送新配置,当系统遇到空字段时,代码抛出了空指针异常(null pointer exception),导致 Service Control 实例完全无响应,并进入崩溃循环(crash loop)状态。

连锁反应:全球服务中断

由于推送新配置没有灰度过程,导致配置在全球范围几秒内迅速生效,且 Service Control 是 Google Cloud 的核心组件,负责 API 管理和配额控制,其故障导致了连锁反应,影响了众多依赖 Google Cloud 的服务和应用,造成了全球范围的互联网中断。

配置灰度及常见的实现路径


什么是配置灰度发布

配置灰度发布是一种软件配置变更策略,通过逐步将新的配置参数发布给一部分服务实例或用户,以降低全量发布可能带来的风险。它允许在不影响大多数用户的情况下,验证新配置的有效性和稳定性。

配置灰度的核心思想是在黑(旧配置)与白(新配置)之间,实现平滑过渡的一种发布方式,确保系统稳定性的同时逐步引入新的配置变更。

配置灰度的主要应用场景包括配置参数调整、功能开关切换、系统阈值修改等需要谨慎变更的配置场景,特别适用于高可用性要求的核心业务系统。

配置灰度的常见实现路径

配置灰度发布作为一种降低风险的发布策略,有多种实现路径。根据不同的业务需求和技术架构,可以选择最适合的实现方式。以下是几种常见的配置灰度发布实现路径:

  • 基于标识的灰度发布
  • 用户 ID 灰度:根据用户 ID 特征(如尾号)决定是否应用新配置
  • IP 地址灰度:基于服务实例 IP 地址进行灰度发布
  • 设备特征灰度:根据设备类型(如 iOS/Android)进行灰度
  • 基于规则的灰度发布
  • 白名单/黑名单:通过维护特定名单控制配置应用范围
  • 标签灰度:给服务实例添加标签,根据标签决定配置版本
  • 业务规则灰度:基于业务场景或特定条件进行灰度
  • 基于流量的灰度发布
  • 比例灰度:按照一定比例的流量应用新配置
  • 区域灰度:根据地理位置或区域进行灰度发布
  • 时间窗口灰度:在特定时间段内进行灰度发布
  • 基于架构的灰度发布
  • 服务网格灰度:利用服务网格技术控制配置分发
  • 网关灰度:在 API 网关层面实现配置灰度
  • 配置中心灰度:通过配置中心直接控制配置分发

业务做配置灰度有哪些方案


基于注册配置中心的配置灰度发布能力

目前业界主流的配置中心有 Nacos、Apollo、Disconf、ETCD 等,其中支持配置灰度发布的主要有 Nacos 和 Apollo。

Nacos 目前支持两种灰度方式,基于 IP 灰度和基于标签灰度,支持某个版本的配置只对某些监听者生效。此外,用户还可在 Nacos 标签灰度的基础上扩展 SPI,以贴合自己的业务场景,比如实现设置多值标签、自定义应用标签 SPI、多版本并行灰度等。

Apollo 的配置灰度发布能力相对简单一些,仅支持基于 IP 的灰度能力,也能基于注册配置中心的能力做二次开发扩展自定义配置灰度发布。

基于注册配置中心的能力做二次开发扩展自定义配置灰度发布

对于业务复杂的用户,有复杂的灰度场景,可能需要基于配置中心的基本能力做二次开发。比如阿里巴巴集团基于 Nacos 开发了基于单元/机房的灰度、基于用户 ID 的灰度等功能。

业务自研产品支持配置灰度发布

对于少数业务非常复杂的用户,市场上的配置中心无法满足需求,则需要自研相关方案,比如运行环境很特殊的场景。

对于大多数用户来说,方案一采用 Nacos 或 Apollo 基本能满足配置灰度的需求。少部分用户可能需要基于配置中心做二次开发,建议在 Nacos 的标签灰度之上开发更复杂的方案。

如何基于 Nacos 实现配置灰度


Nacos 配置灰度介绍

Nacos 作为一个动态服务发现、配置管理和服务管理平台,提供了强大的配置灰度发布功能,帮助开发者安全地进行配置变更。本节将介绍 Nacos 配置灰度发布的基本概念、功能特性和使用场景。

Nacos 配置灰度发布的核心功能

  • 基于 IP 的灰度发布:通过指定服务实例的 IP 地址,将新配置仅推送到特定的服务实例,其余实例保持原有配置不变。
  • 基于应用标签的灰度发布:通过为服务实例添加标签,根据标签属性决定配置的推送范围,支持更灵活的灰度策略。
  • 命名空间隔离:利用 Nacos 的命名空间(Namespace)机制,创建独立的灰度环境,与生产环境完全隔离。
  • 配置标识区分:通过在 dataId 或 group 中添加特定标识,区分灰度配置和正式配置,便于管理和追踪。

图1:配置发布流程图

使用 MSE Nacos 进行配置灰度发布

上一节讲述了 Nacos 配置灰度的核心能力,本节讲述基于 IP 的灰度发布和基于标签灰度的具体用法

基于 IP 的灰度发布

基于 IP 的灰度发布是一种基础的灰度方式,可以通过选择 IP 地址列表来确定需要灰度的机器,在一些小型业务系统中,这种方式可以满足灰度的需求,能够大大降低配置推送的风险,减少因配置出错导致的故障。

1. 登录 MSE 注册配置中心管理控制台,并在顶部菜单栏选择地域,选择目标 Nacos 实例;

https://mse.console.aliyun.com/

2. 在目标配置的操作列单击编辑。在编辑配置面板,发布方式选择基于 IP 灰度发布。

3. 单击应用节点 IP 输入框,在 IP 地址列表中选择待灰度推送的 IP 地址。您也可以选择手动输入 IP 地址,手动输入支持 IP 地址补全。

4. 修改完配置后,单击发布灰度。在配置内容对比对话框中确认当前正式版本内容本次发布内容,然后单击发布

基于标签的灰度发布

为了解决基于 IP 灰度的局限性,MSE Nacos 对灰度发布进行了功能升级,支持了自定义标签灰度的能力,结合原先的 IP 灰度,可以给业务提供更加灵活更加易用的灰度发布能力,为业务稳定性保驾护航。

自定义标签灰度允许应用侧根据其实际场景给不同的节点设置不同的标签,比如给节点设置应用,机房,环境等标签,比如在阿里集团内部,同一个应用在线下环境中有不同的项目开发分支,就给对应的开发分支部署的节点打上项目分支的标签,借助标签灰度的能力实现不同的项目环境下发不同的配置内容。

在 MSE Nacos 2.2.3.3 及以上版本中,支持基于应用标签灰度的方式进行灰度发布,您可以在客户端对应用节点进行标签设置并针对标签进行灰度发布。

1. 客户端设置应用标签

通过以下方式设置应用的标签,应用标签为 key-value 格式。可以通过 properties,JVM 参数和环境变量三种方式指定。相同 key 的情况下,默认优先级:properties > JVM 参数 > env 环境变量,nacos.config.gray.label 是 Nacos 内置的默认配置灰度标签。

//1.properties形式传入
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, "your endpoint");
properties.put("project.name", "your app name");
properties.put("nacos.config.gray.label","yourgrayname");
//2.JVM参数设置设置启动参数
-Dnacos.config.gray.label=yourgrayname
nacos_config_gray_label=yourgrayname 
//3.env环境变量指定设置环境变量 
String dataId = "gray_test_dataid"; 
String group = "test-group"; 
configService.addListener(dataId, group, new Listener() {        
    @Override        
    public Executor getExecutor() {            
        return null;        
    }        
    @Override       
    public void receiveConfigInfo(String configInfo) {           
        System.out.println("receiveConfig:" + configInfo);        
    } 
});

2. 服务端发布标签灰度

  • 查看监听者标签

客户端完成应用标签注入后,可以通过服务端查看配置的监听者列表,查看每个监听者携带的标签。

  • 发布灰度标签配置

单击编辑配置,选择基于标签灰度发布,然后选择应用节点当前存在的标签键值对,可以看到选择的键值对所匹配到的节点数。

发布灰度标签版本后,在监听查询可以看到当前客户端所匹配的配置版本。在配置详情可以看到当前灰度版本的详情。

在进行第一批灰度观察后,可以通过扩大编辑标签的值范围来逐步扩大灰度,直到进行全量发布,单击全量发布后,将停止对应的灰度版本。如果在灰度过程中发现业务异常,可以单击停止灰度进行一键自动回滚。

Nacos 标签灰度除了提供基本灰度能力外,还可以衍生出更高阶的用法,如设置多值标签、自定义应用标签 SPI、多版本并行灰度等。

总结


Google Cloud 在 2025 年 6 月 12 日的全球性故障事件为我们提供了宝贵的教训。一个简单的空指针异常,由于缺乏适当的错误处理和灰度发布策略,导致了全球范围的服务中断,影响了数百万用户和企业。这一事件再次证明,即使是技术巨头也不能忽视配置灰度发布的重要性。


通过本文的分析,我们可以清晰地看到,如果 Google Cloud 采用了类似 Nacos 的配置灰度发布策略,可能会避免全球性服务中断,通过小范围验证发现问题,控制影响范围,并能快速回滚配置。

相关文章
|
1月前
|
人工智能 Linux API
OpenClaw是什么?OpenClaw能做什么?2026年OpenClaw介绍及部署保姆级图文教程
在AI智能体快速普及的2026年,OpenClaw(曾用名Clawdbot、Moltbot)作为一款开源AI Agent框架,凭借“本地优先、模块化技能、多通道接入”的核心优势,成为连接大模型与本地系统的核心工具,无需专业开发能力,新手也能快速上手,实现自动化办公、数据抓取、系统运维等多种场景需求。本文将全面解析OpenClaw的核心定位与功能,详细拆解2026年新手零基础下阿里云部署、MacOS/Linux/Windows11本地部署的完整流程,同步讲解阿里云百炼API配置方法,并汇总高频常见问题及解决方案,全程附带可直接复制的代码命令,确保零基础用户也能顺利完成部署与使用。
2574 15
|
4月前
|
监控 Devops Java
🚀 利用云效DevOps完成首次自动化部署:开发到上线仅需1小时
一位独立开发者借助阿里云云效DevOps,将原本耗时两天的手动部署缩短至47分钟,部署频率从每月一次跃升至每日三次。本文详解如何通过云效实现代码提交到线上部署的全流程自动化,涵盖流水线搭建、多环境部署、自动化测试与效能度量,助力团队迈向高效持续交付,让发布从“大事件”变为日常小操作。
|
4月前
|
消息中间件 运维 物联网
语音通知
适用于科技公司服务器或物联网设备异常时的语音告警通知。开通语音服务后,可申请资质、话术与模板,通过API调用实现语音电话告警,支持变量替换与呼叫记录查询,提升运维响应效率。(238字)
|
4月前
|
人工智能 Serverless API
一键部署Stable Diffusion教程
本实验指导用户通过函数计算控制台部署AI绘画应用Stable Diffusion,支持选择绘图类型与地域,利用免费额度或套餐包体验服务。需注意授权、镜像加速状态及费用说明,部署完成后可访问WebUI生成图像。
 一键部署Stable Diffusion教程
|
4月前
|
XML 算法 安全
详解RAG五种分块策略,技术原理、优劣对比与场景选型之道
RAG通过检索与生成结合,提升大模型在企业中的应用效果。分块策略是其核心,直接影响准确性与召回率。本文系统解析固定大小、语义、递归、结构及LLM五种分块方法的原理、优劣与适用场景,并提供选择建议与前沿优化方向,助力构建高效可靠的RAG系统。
|
4月前
|
前端开发 Java 数据库连接
RuoYi
若依(RuoYi)是一款基于SpringBoot、SpringCloud的开源快速开发平台,支持单体与微服务架构。提供权限管理、代码生成器、多版本前端(Vue/Uniapp),集成Redis、Nacos等主流组件,具备响应式布局与多设备适配能力,全系列免费商用。
RuoYi
|
4月前
|
人工智能 JSON 安全
大模型应用开发中MCP与Function Call的关系与区别
MCP与Function Call是大模型应用中两大关键技术。MCP作为标准化协议,打通模型与外部工具的通用连接;Function Call则是模型调用外部功能的具体机制。前者如“桥梁”,后者似“工具”,二者互补协同,推动AI应用向更开放、灵活、安全的方向演进,构建“意图解析-协议传输-工具执行”的分层架构新范式。
|
4月前
|
SQL 监控 机器人
钉钉通知
本文介绍如何通过Java代码调用钉钉机器人API,实现系统告警消息的实时推送。涵盖机器人创建、PostMan测试、Java代码编写及实际应用优化,如封装工具类、配置解耦等,并提供常见失败原因分析,助力高效集成钉钉告警通知。
钉钉通知
|
4月前
|
NoSQL Java 数据库连接
SpringBoot框架
SpringBoot简化Spring开发,核心功能包括starter起步依赖、自动配置及内嵌服务器支持。通过条件注解实现Bean的自动化配置,支持多种外部配置方式且优先级高于内部文件。自定义starter需分离依赖与自动配置模块,并按版本规范注册配置类。
|
安全 网络安全 网络架构
掌握traceroute:网络工程师解决路由问题的利器
【8月更文挑战第22天】`traceroute`是网络工程师的关键工具,用于追踪数据包从源到目的地的路径,帮助诊断网络问题并优化性能。通过向目标发送具有特定生存时间(TTL)值的数据包,`traceroute`能揭示每跳路由器的信息及延迟,便于识别瓶颈与故障。其基本用法为`traceroute [options] hostname/IP`。
605 1
下一篇
开通oss服务