什么是灰度发布?百度百科的解释是这样的:
从上述可以看出,灰度发布的作用有以下几点:
结合工作中使用到的灰度发布实践和对其他大厂的灰度发布调研,总结了以下灰度发布方案。
灰度发布如果按照端来分的话,可以分为web前端、客户端、服务端灰度。
无论是哪种灰度,一般需要满足以下2点要求:
假设我们的前端资源存放在CDN上面:我们每次发布一个新版本,就把资源增量式地上传到CDN,然后给它分配一个唯一的版本号,再把所有的版本号存储起来。当处理请求时,根据动态配置的分流策略来决定用户使用哪个版本。
比如分流策略是放量10%,即新版本随机放量给10%的用户使用,当用户首次命中资源版本号时,需要把用户id和版本号的映射关系存储起来(可存到cookie),这样就能保证同个用户上次请求和下次请求访问到的都是同个版本的代码。
那如果线上有紧急bug需要修复,又要重新发布新版本,该如何处理当前灰度的状态?是赶紧结束上一个灰度然后全量发布还是一起发上去同时灰度?一般来说,再有新版本发布或者放量策略发生变化时,应该重新分流灰度。
服务端灰度分为兼容变更灰度和不兼容变更灰度。
1)兼容变更
兼容变更又可分为物理灰度和逻辑灰度。
2)不兼容变更
不兼容变更指的是更改了当前功能,即接口逻辑跟之前版本发生很大变化,必须要前后端同时发布,否则会有一段时间服务不可用。
一般的做法是引入接口版本号,新老版本接口并存,比如 /v1/api 和 /v2/api。前端使用/v2/api版本,当过去一段稳定期后(可以是登录态时间失效后),就可下掉/v1/api版本。
web前端和服务端灰度发布可以在客户无感知的情况下平滑进行,遇到问题也可以快速回滚,但是移动客户端涉及到用户的主动安装行为,所以上述的方式已经不适用。
如果一个带有bug的安装包全量发布出去,一旦有问题,我们只能快速定位问题来提醒用户安装新版本,是否安装取决于用户,所以客户端灰度发布是非常有必要的。
客户端在启动时,会向灰度系统发起请求,灰度系统根据客户端传过来的参数和当前的放量策略来决定是否要给客户端升级提醒。一般会根据以下几种策略来决定给予用户升级提醒:
通过设备ID主要是为了控制提醒频率,用户ID主要是为了区分出特性用户,比如对活跃用户发送提醒。
流量策略一般分为以下几种:
先到先得的方式比如限制10%的用户体验的是新版本,90%的用户体验的是老版本。先访问网站的用户就优先命中新版本,直到流量用完为止。
比如根据用户的注册来源来放量。
通过上面的讲解,可以看到一个完整的灰度发布,包括前端、后台都需要额外的代码量去实现,如果只有几万的用户,要去实现这样一套灰度发布,代价是比较高的。
但如果是百万~亿级用户,灰度发布是很值得的,它不仅能降低新版本bug的风险,还能通过版本对比,推出最好效果的版本应用。
好了,这篇文章的内容字条网就和大家分享到这里!