灰度发布-上线前的最后一公里

5,139 阅读5分钟

一、什么是灰度发布?

要想了解这个问题就要先明白什么是灰度。灰度从字面意思理解就是存在于黑与白之间的一个平滑过渡的区域,所以说对于互联网产品来说,上线和未上线就是黑与白之分,而实现未上线功能平稳过渡的一种方式就叫做灰度发布

非黑即白从来不是一种普遍现象,从色彩角度讲,灰度指不饱和的黑色,我们把黑色定为基准色,每个灰度对象是从白色(0%)到黑色(100%)的中间值,这中间的98%都是灰。

%e9%bb%98%e8%ae%a4%e6%a0%87%e9%a2%98-%e8%ae%be%e8%ae%a1%e5%88%9b%e5%bb%ba%e4%ba%8e%e5%88%9b%e5%ae%a2%e8%b4%b4-7

二、灰度发布的机制?

可以通过很多种形式来抽取一部分用户,比如说选择自己的VIP用户,或者选择一些活跃用户,把这些用户分成两批,其中一批投放A版本,另外一批投放B版本,在投放之前就要对各种可能存在的数据做到收集记录工作,这样才能在投放以后查看两个版本的用户数据反馈,通过大量的数据分析以及调查来确定最后使用哪一个版本来进行投放。

一套完整的灰度发布机制会包括下面这些阶段:

用户标识:主要是区分用户,同时也为数据分析做辅助。

目标用户/流量筛选:需要参考用户特征、用户流量、用户范围及用户体验的一致性,版本迭代针对全部用户还是部分用户,小流量试验通过再放量,一般来说按照内部用户-种子用户-活跃用户-所有用户的顺序就是一种典型的范围控制,体验一致性要求考虑新旧版本的跨度是否过大,用户能否接受。

实时数据监控:监测诸如新版本稳定性、服务器稳定性、使用次数、使用频率等数据与原有数据对比。

一键发布/回滚:从数据反馈结果决定是否发布/回滚。

下图是阿里软件的发布引擎,支持灰度交付。

image

三,涉及到数据库变更,如何支持灰度?

假设灰度的服务,需要使用到数据库,如果灰度前后数据库的字段保持不变,那么新旧两套系统使用同一套数据库就可以了.

如果前后数据不一致,需要处理的情况就比较复杂,分为以下几种情况.

  • 部分灰度

在部分灰度的情况下,有部分请求到旧系统上,另一部分请求到了新的灰度系统上.走到旧系统的请求,还是照原样处理.但是走到了新版灰度系统的请求,需要同时将请求转发给旧系统上来对应的接口上修改旧系统的数据.如果走到新系统的请求查不到该用户的数据,还需要首先同步一份来新系统上.如果是事务性的请求,以写入老系统成功来做为操作成功的标准.

  • 全部灰度

在灰度系统已经全部接管了线上流量之后,为了安全起见,仍然需要对新老系统进行双写,步骤和前面一样.

  • 灰度完成

灰度完成与前面的全量灰度状态不太一样,区别在于前面的全量灰度状态下,仍然不能肯定系统一定是没有问题的,所以需要进行新旧系统的双写来保证数据可以在老系统上进行回滚.而在灰度完成状态,此时认为这个新版本已经完全通过了验证,无需再写入旧系统了.但是此时可能存在部分在灰度期间没有上线的用户,此时需要做一次同步,从旧系统上将这部分数据同步过来.

可以看到,这三个状态下,对新旧系统是否进行双写,做了严格的区分,目的只有一个:一旦新上线的系统出现问题,可以马上撤掉灰度系统,而这期间用户的任何修改在旧系统上都是可以找到的.

四、总结

有人质疑灰度发布是一种浪费。但与其说这是浪费不如说是冗余和弹性,灰度发布能避免新版本全量上线的风险,通过小流量验证的方式,在灰度阶段就能发现、调整并优化产品中的问题,平滑迭代。同时还要对所有的相关数据进行收集工作,比如新版本的稳定性,服务器的稳定性以及使用次数,使用频率以及各种数据,方便和以前的原有数据进行对比。

也许有人会觉得灰度发布完全没有必要,是一种资源的浪费,其中灰度发布是非常有用的,这样做的目地不但能了解最真实的用户体验同时还可以有效的防止重大BUG产生影响系统回档或者造成其他更多不必要的经济损失,所以说灰度发布是有效避免新版本上线风险的一种有效办法,可以通过小流量来先进行测试工作,帮助新版本完成平滑迭代。