灰度机制

这是一篇关于 灰度 的文章,揭开灰度这一不为人们熟知的神秘概念的面纱。

灰度

灰度一般是指在生产环境,对一部分用户进行特殊处理。一般适用于更新或发布某个具有侵入性或有风险的功能时,对小部分用户进行测试,以确定是否影响正常用户使用,以及保证发布的平滑过渡,保证用户体验和可控性稳定性。

常见概念

  1. 服务链:具有一定业务上下游关系的多个服务构成的调用服务链
  2. 泳道:对服务链按需求进行分组复制,并实现逻辑、物理的隔离,使不同需求的服务链互不影响
  3. 实验:即一次灰度的上线发布
  4. 色标:用来区分标识流量的所属,是一个区分实验所属性的字符串
  5. 染色:通过设置请求头或请求参数为一次请求添加色标
  6. 脱色:染色的逆过程
  7. A/B testing:即对服务链进行灰度,让部分用户继续使用产品特性 A,另一部分用户使用特性 B

一般来说,根据业务,我们区分流量的灰度方式(什么人继续用 A,什么人用新的 B)也有多种,有基于帐号的,有基于地区的,有基于时间段的,也有基于用户身份的。

  • 物理隔离:通过增加机器的方式来搭建真正意义上的流量隔离。这种方案需要为要灰度服务搭建一套网络隔离、资源独立的环境,在其中部署服务的灰度版本。由于与正式环境隔离,正式环境中的其他服务无法访问到需要灰度的服务。
    虽然这种方案比较简单直接,但需要耗费大量的资源成本
  • 逻辑隔离:由网关、MQ等中间件和各个微服务来识别灰度流量,并动态转发至对应服务的灰度版本。
    这个也是目前最常用的方案

AB 测试

从线上流量中完全随机地取出一小部分(较低风险)分成两组,施加原策略A和新策略B(排除干扰),再结合一定的统计方法,得到对于两种策略相对效果的准确估计(量化结果)

利用哈希桶的方式,确定的用户标识入参带来确定性的流量导向,可以保证保证用户随机、均匀地进入到不同实验的实验组中,在大规模多路复用的情况下并行执行且互不干扰(基于泳道机制)

核心思路

当出现需要灰度发布的需求时,往往需要借助泳道实现逻辑隔离的环境。我们可以通过部署一个泳道,在新的泳道中对于需要特殊处理的服务进行拷贝和修改,使得服务链中一致的服务进行复用,对于不同逻辑的服务再进行修改和隔离,以更小的代价组建出一个新的调用链。此外,染色组件和染色服务需要独立在外部,或者说流量进入泳道前对请求进行染色。

比如我们有个需求,需要随机使得1%的用户体验到新的灰度功能,那么我们可以为比如用户ID这一唯一身份标识进行染色。例如我们对ID的十进制最后两位数字进行限定,只有以01为后缀的用户才能享受到此服务,之后我们可以通过判断后缀是否是01或在请求头中添加色标来判断用户是否属于灰度用户。这样,在经过网关或MQ的时候,即可判别出用户是否属于灰度用户,从而进行对应的处理。