灰度发布机制介绍

[字体···] [宽度···]


今年八月份,我们部门发布“禁止未经测试验证、不具备观测能力、未经灰度发布、不具备应急止损能力的服务进行上线变更”红线,目的是为了降低线上故障率,线上故障是个很玄乎的玩意,你觉得没问题这次稳了,啪说不定它就跳出来了,在公司里故障是与绩效挂钩的,出问题要有人担责。我曾经请教过一位大佬,他是做游戏开发的,我曾问他“您认为软件开发中最重要的技术能力是什么”,他答:“软件开发需要细心,不出问题比性能更重要”,大佬的话很实在。

灰度发布在大厂中是重要的功能组件,关乎软件的稳定性,作为一个开发我们如何去使用这个功能,或者怎么去实现简单的灰度功能呢,本文将尝试回答这些问题。

什么是灰度发布

灰度发布就是让系统的一部分人优先使用功能,从而达到提前发现问题,降低故障影响范围的发布方式。

灰度发布还有另一个名字 —— 金丝雀发布。

在灰度发布的概念里,通常认为“未发布”和“已发布”的功能是一对非黑即白的关系,为了实现白面到黑面的平滑过度,就一点一点对系统流泪进行放量,直至百分之百功能完全发布。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。

为什使用灰度发布

1、为了降低故障影响范围,提升系统的稳定性

2、A/B testing 是基于灰度的,通过灰度可以预采用户行为数据,及早获得用户的意见反馈,完善产品功能,提升产品质量。

作为软件开发人员,我们更加关注 1,毕竟出故障是可能掉饭碗的。

灰度发布方式

  1. 更新过程可以暂停,停在一个既有新版本又有旧版本的状态,然后选择升级或者回滚
  2. 支持流量比例分配,可以把百分之几的流量分配给一个服务,剩下的给另一个服务
  3. 支持 URL 路径流量分配,一个路径下的流量给一个服务,另一个路径流量给另一个服务
  4. 古老的方式,通过代码逻辑实现一定灰度

首先,前三个需要很好的软件基础设施来支撑,对于中小型软件来说很难实现,第 4 对于任何软件来说都是可以实现的,配合常用的中间件(配置中心)就可以达到很好的效果。

灰度发布流程和工作

灰度的粒度可以很大也可以很小,大是可以以机器维度,例如某一批机器(部署了新功能)承担线上的多少流量;小到可以精准控制某个用户是否被灰度到,如果灰度到就使用新功能。

灰度也可以按照 URL 路径,通常某个路径(RESTful API,指一个功能)的流量可以按照某个策略分配固定流量。

灰度也可以按照客户端的 IP 进行分流,这点有点像 Load Balance 很像。

灰度过程中可能采集数据,比如 UV、PV 等。

综上所述,我们需要用户的一个表标识、功能的标识,我们还需要一个策略,是随机进行分流还是权重,或者固定用户等,最后我们需要被访问的对象信息(机器、容器列表),其过程如下:

灰度发布架构

灰度发布架构与负载均衡的架构很相似,通常负载均衡策略就是我们的灰度策略,它的一般架构如下:

灰度发布重点

定义目标

1、新功能验证(看这个新功能的指标是否能达到预期,或者是否会对产品造成损失,大多数是这个目的)

2、新功能尝试(看这个功能是否符合用户需求,不符合则下线)

选定灰度策略

用户选择:终端类型、地理位置、用户类型、随机用户或固定用户。

功能覆盖度:逐步功能开发还是全部功能开放。

功能反馈:1)提供用户反馈入口,让产品运营能够及时了解用户使用情况。 2)开发侧使用监控工具及时了解新功能情况,流量、告警有无异常等。

筛选用户

用户范围:内部用户-> 活跃用户 -> 所有用户

灰度发布面临的问题

1、以偏概全

选择的样本不具代表性,样本用户使用习惯并没有涉及所有升级的核心功能。

2、无法定量分析

结果没有量化手段,只依赖用户问卷调查,没有分析灰度系统。

运营数据不全面,只有核心业务指标,没有用户体验指标等。

3、用户参与度不够

如果用户参与度不够就很难对灰度版本的优劣进行分析评价。

具体措施

运维同学

方式一:利用 Nginx 配置负载控制。

方式二:使用 HTTP 头信息判断+权重(灰度值)

HTTP 请求传输过程中,会自动带上 User-Agent,Host,Referer,Cookie 等信息,我们需要分析 IP 地址段,用户代理,Cookie 中的信息。根据 Cookie 查询 version 值,如果该 version 值为 v1 转发到 host1,为 v2 转发到 host2,都不匹配的情况下转发到默认配置。

方式三:使用灰度发布工具

从长远来看需要使用工具作灰度发布。

研发同学

1、流量控制

使用工具控制灰度放量,最好的方式是通过配置系统在不停起服务变更流量。

2、版本控制、回滚策略

制定回滚策略、回滚版本,当灰度出现异常及时止损。

3、监控系统

对灰度功能进行监控、告警。

运营同学

监控新功能使用情况,是否使用频繁。

用户满意度的监控,带来了新用户?导致老用户卸载?

总结

灰度发布功能是软件产品稳定性的基石,另外灰度发布也为产品运营提供更好的抓手,提前获取用户的反馈意见,提前完善产品功能,提升产品质量。

灰度发布不简单,流程上几乎涉及所有产研同学,无论是前后端,还是产品运维;好用的灰度发布需要强大的基础设施来保障,它涉及 DNS 解析、负载均衡、服务版本控制、服务回滚、数据采集分析等。

参考:

Top↑