灰度发布介绍
今年八月份,我们部门发布“禁止未经测试验证、不具备观测能力、未经灰度发布、不具备应急止损能力的服务进行上线变更”红线,目的是为了降低线上故障率,线上故障是个很玄乎的玩意,你觉得没问题这次稳了,啪说不定它就跳出来了,在公司里故障是与绩效挂钩的,出问题要有人担责。我曾经请教过一位大佬,他是做游戏开发的,我曾问他“您认为软件开发中最重要的技术能力是什么”,他答:“软件开发需要细心,不出问题比性能更重要”,大佬的话很实在。
灰度发布在大厂中是重要的功能组件,关乎软件的稳定性,作为一个开发我们如何去使用这个功能,或者怎么去实现简单的灰度功能呢,本文将尝试回答这些问题。
什么是灰度发布
灰度发布就是让系统的一部分人优先使用功能,从而达到提前发现问题,降低故障影响范围的发布方式。
灰度发布还有另一个名字 —— 金丝雀发布。
在灰度发布的概念里,通常认为“未发布”和“已发布”的功能是一对非黑即白的关系,为了实现白面到黑面的平滑过度,就一点一点对系统流泪进行放量,直至百分之百功能完全发布。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。
为什使用灰度发布
1、为了降低故障影响范围,提升系统的稳定性
2、A/B testing 是基于灰度的,通过灰度可以预采用户行为数据,及早获得用户的意见反馈,完善产品功能,提升产品质量。
作为软件开发人员,我们更加关注 1,毕竟出故障是可能掉饭碗的。
灰度发布方式
- 更新过程可以暂停,停在一个既有新版本又有旧版本的状态,然后选择升级或者回滚
- 支持流量比例分配,可以把百分之几的流量分配给一个服务,剩下的给另一个服务
- 支持 URL 路径流量分配,一个路径下的流量给一个服务,另一个路径流量给另一个服务
- 古老的方式,通过代码逻辑实现一定灰度
首先,前三个需要很好的软件基础设施来支撑,对于中小型软件来说很难实现,第 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 解析、负载均衡、服务版本控制、服务回滚、数据采集分析等。
参考: