什么是灰度发布?
所有互联网公司的产品都是在不断迭代的,每当新版本要上线的时候,我们都会面临一个问题:让所有用户都同时更新到新版本是具有潜在风险的,如果出现了问题或者新版本不符合预期,就会造成不可挽回的全面损失。而灰度发布就是来解决这样的问题的。
灰度发布在开始的时候只将新版本分发给一小部分用户,然后收集用户主动或被动的反馈来分析新版本的情况,如果一切正常,继续扩大新版本的分发量,直至所有用户都使用新版本。这种循序渐进的发布方式可以有效减少风险,一旦出现问题或者新版本不符合预期,可以及时回滚,受到影响的也只是开始的那一小部分用户而已。
迭代的潜在风险
灰度发布的目标是在迭代过程中降低潜在风险,那么我们到底在降低什么样的风险呢?主要有两方面:系统稳定性和业务指标。
首先来谈谈系统稳定性,新版本虽然可能已经在内部做过大量的测试了,但到了正式发布的时候依旧有潜在的不稳定因素。生产环境与测试环境的差异、测试的盲点等等都可能会导致系统出现问题,严重的可能还会导致系统崩溃。
其次是业务指标,任何迭代都必然会对业务指标产生影响,而业务指标的下降显然是我们不希望看见的。如果一个电商网站的新版本上线后,日订单总额下降了,这将会直接导致公司的收入下降。其他需要关注的业务指标还有很多,比如注册率、留存率、日活跃时间等等。除了这些客观数据之外,我们还应该留意用户的主观反馈,全面地了解新版本的情况。
我们采用灰度发布的目的是很明确的,就是在发布新版本的时候,规避风险,保证系统稳定的同时保证业务指标不下降(最好能有提升)。
传统的灰度发布方式
通常情况下,各个互联网企业都会搭建自己的灰度发布系统,虽然系统并不复杂,但依旧会消耗人力去完成这件事情,再加上后期的维护修改等等,都是不小的投入。所以对较小的企业来说,自己搭建就不那么值得了,此时完全可以采用第三方工具,以最低的成本进行灰度发布。通常来说,需要灰度发布的产品主要集中在Web、iOS、Android三个平台上,每个平台都有不一样的特点,所以进行灰度发布的过程也会有一些区别。
Android上的灰度发布主要依赖应用分发渠道,我们可以只把新版本投放到某一个应用商店中,从而达到小部分测试的目的。然后让运营人员收集用户的投诉、建议,再配合后台自动收集的数据去分析新版本的运行情况。如果顺利,在所有应用商店投放。如果不顺利,停止分发、解决问题、制作新的安装包、再次灰度发布。
iOS由于Apple Store的原因,就不能够像Android一样通过渠道控制的方式来达到小部分测试的目的。所以有时候我们就会利用越狱的一些渠道来达到目的。后续的工作和Android相同。
Web应用由于自身的独特性,能够比较完美地去做灰度发布。企业可以在负载均衡系统上做一些改造,使得特定的用户获取的网页是新版本的。我们随时都可以很方便地修改新版本的流量,根据需求快速做出调整。最后,我们采用和APP端一样的方式收集并分析结果。
使用云眼AB测试做灰度发布
前面提到过,在进行灰度发布的时候,我们考虑的因素有两个:系统稳定性和业务指标。
首先我们来谈谈如何保证业务指标不下降。传统的灰度发布方式在产品发布前是不知道结果的,新版本可能提升也可能降低。如果业务指标下降了,我们很可能就要回滚版本并重新制作新的应用,再次灰度发布。反反复复直到业务指标不下降了。那我们为什么不在灰度发布前就基本确定出一个业务指标不下降的新版本呢?这样就可以避免前面说到的问题了。使用云眼的AB测试功能可以通过科学的试验来分析出正确的改动方案,将这些由试验得到的改动方案添加到新版本中,基本就能保证业务指标的提升了。
系统稳定性方面,Web应用可以利用云眼系统轻松实现流量控制,而不需要改造负载均衡系统。你所要做的只是在页面中嵌入一行js代码而已。为了监控系统是否稳定运行,我们还可以在代码的关键位置追踪应用的运行情况,如果出现异常就通过云眼SDK发送到云眼后台并记录。结合用户的反馈判断系统是否稳定,功能是否正确。由于原生客户端的自身原因,我们依旧采用传统的流量控制方式,通过分发渠道推送新版本。最后利用云眼SDK追踪异常情况,分析结果。如果系统稳定,我们就可以扩大流量,直至全部采用新版本。
所以,我们给出了这样的迭代方案。首先通过云眼系统开展AB测试,依据测试结果开发新版本,最后通过云眼系统的流量控制和目标追踪功能来完成灰度发布。