灰度发布的定义:
灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式。AB test就是一种灰度发布方式,让一部分用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度,而我们平常所说的金丝雀部署也就是灰度发布的一种方式。
灰度发布结构图如下:
灰度发布/金丝雀发布由以下几个步骤组成:
准备好部署各个阶段的工件,包括:构建工件,测试脚本,配置文件和部署清单文件。
从负载均衡列表中移除掉“金丝雀”服务器。
升级“金丝雀”应用(排掉原有流量并进行部署)。
对应用进行自动化测试。
将“金丝雀”服务器重新添加到负载均衡列表中(连通性和健康检查)。
如果“金丝雀”在线使用测试成功,升级剩余的其他服务器。(否则就回滚)
除此之外灰度发布还可以设置路由权重,动态调整不同的权重来进行新老版本的验证。
灰度发布涉及到的专有名词解释:
灰度期:灰度发布开始到结束期间的这一段时间,称为灰度期。
灰度发布引擎:对于一般的小系统并不需要单独的灰度发布引擎,可以参考A/B测试中做法,在页面javascript或服务器端实现分流的规则即可。但对于大型的互联网应用而言,单独的用于管理用户分流的发布引擎就很有必要了。
用户标识:用于区分用户,辅助数据统计,保证灰度发布过程中用户体验的连贯性(避免用户在新旧版本中跳变,匿名Web应用比较容易有这个问题)。匿名Web应用可采用IP、Cookie等,需登录的应用可直接采用应用的帐号体系。
目标用户选取策略:即选取哪些用户先行体验新版本,是强制升级还是让用户自主选择等。强制升级可考虑的因素很多,包括但不限于地理位置、用户终端特性、用户自身特点等。用户自主选择,让用户自主选择采用stable、beta、unstable channel的版本。在用户有明确预期的情况下自行承担试用风险。
数据反馈:用户数据反馈:在得到用户允许的前提下,收集用户的使用新版本应用的情况。如客户端性能、客户端稳定性、使用次数、使用频率等。用于与旧版本进行对比,决策后续是继续扩大新版本投放范围还是回滚。服务端数据反馈:新版本服务端性能、服务端稳定性等,作用与用户数据反馈类似。
新版本公关运营支持:对于改版级别的大型升级,需要配合公关运营支持,用于及时处理用户在微博、博客等渠道给出的“显式反馈”。对比通过隐式数据反馈得到的结论后,综合考虑应对策略。
实现灰度发布的两种技术方式:
一、在代码中做。一套线上环境,代码中做开关,对于不同的用户走不同的逻辑
二、在接入层做。多套(隔离的)线上环境,接入层针对不同用户转发到不同的环境中
接入层采用nginx,可以基于IP或cookie的方式进行分流,由于我们是商业ERP系统,有用户登录的逻辑,自然选择基于cookie的策略。
就基于cookie的分流策略而言,又有两种实现方案
nginx维护Cookie名单文件,每来一个请求看Cookie是否在名单中,做不同的转发
nginx不维护Cookie名单文件,根据Cookie的特征进行转发
第一种方案的缺点显而易见,每次请求判断是否是灰度用户时间复杂度为O(N);且变更名单,需要操作接入层服务。第二种方案具体的实现策略:
1 业务中维护白名单文件(存放在数据库中)
2 在登陆时,如果用户在名单中则给用set特定标识的Cookie;退出或Session过期后Cookie失效
3 nginx匹配特定Cookie,做转发
这样,调整灰度的范围,只需要操作数据库即可,无需重启服务。
灰度发布的企业实际案例:
淘宝网灰度发布(转载):
从产品经理的角度来看:淘宝的发布流程一般是这样的,首先产品经理说服老板、老板的老板、开发Leader、开发成员、测试、设计师、BI等等我们要做的这个产品是牛逼而且有价值的。然后确认改版的设计并完成开发。开发后的版本会在内部工程用的服务器上(需要指向特定 URL)可以看到,然后是时间1周~2个月的测试,测试完成验收达到设计目标和发布标准后,会进行内部发布。内部发布后的版本,阿里巴巴内网上淘宝看到的就都是新版本了,这叫做“小淘宝”发布。这个阶段可能持续1天~1个月,内部员工会看到新的页面并吐槽或发现bug并提交修改。
然后根据产品的不同,会有一个逐步上线切换的过程,比如先切5%全网流量,这个时候可以收集到真实的用户数据了,这个阶段性相当于AB test,通过AB我们知道产品的表现是否达到了设计时吹的牛逼。如果牛逼能够圆上,并且没有出bug,那么就会逐步加码流量直到50%-100%。淘宝有非常完善的工具链可以让产品经理实时地看到不同版本bucket下的PV UV 引导成交等指标性数据。
不同产品的AB控制是不同的,有的是在web服务器层,有的是接口层,算法产品则更有非常完善自动化的工具链,可以做到新的算法开发通过验收后瞬间发布并进行灰度。灰度数值填写后瞬间生效瞬间看到数据。一天多的情况下可以进行多达10轮AB test并且支持超过10个算法同时跑在线上赛马看哪个稍微不傻逼一点。
总结下来,发布流程是这样的:
产品需求收集和确定-->技术方案出具和分工协调-->开发编码-->内部服务器环境的测试+联调(又名预发布环境)-->小淘宝环境发布,内部员工喷喷喷-->小流量(具体有多小取决于业务影响面)公网测试-->收集数据写反馈-->全量上线。