动态策略流量灰度发布

黑白之间的平稳过度

前言

听了组里一位大佬关于灰度发布方案的分享会,受益匪浅。于是整理了这一篇博客,加深一下印象和理解。

什么是灰度发布

引用百度百科的一段解释:

灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式。在其上可以进行A/B testing,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。

为什么要做灰度发布

一个产品,如果需要快速迭代开发上线,又要保证质量,保证刚上线的系统,一旦出现问题那么可以很快的控制影响面,就需要设计一套灰度发布系统。灰度发布系统的作用在于,可以根据自己的配置,来将用户的流量导到新上线的系统上,来快速验证新的功能修改,而一旦出问题,也可以马上的恢复,简单的说,就是一套A/BTest系统。

  • 灰度发布,动态分流,即时生效,无需重启
  • 降低系统升级带来的影响范围,保证系统稳定性
  • 提前规避一定的风险,具有一定的容灾能力

方案选型

ngx_lua

简介:

原理:

  • 将lua VM嵌入到nginx worker里,nginx各阶段lua都可以参与
  • nginx IO原语封装注入lua VM,lua可以发起IO请求
  • ngx_lua采用协程处理每个请求,协程间互相隔离,数据安全
  • lua调用IO操作不能立即完成时,将自身协程挂起,不拥塞worker

虚拟主机配置:

第一红框处,定义了两个upstream节点,一个是灰度服务器,一个是默认服务器;
第二个红框处,代理了这两个upstream节点;
第三个红框处,加载灰度策略控制的lua脚本。

灰度策略控制中心lua脚本:

在redis中存放需要认证的一些条件,然后在lua脚本中中获取这些条件进行判断,达到不同case走不同的upstream的效果。

架构图:

客户端(Client)发起请求,负载均衡集群(LB)接受参数并传入代理层(Proxy),然后经过规则验证命中不同的服务器(Server)。

策略控制中心:

整体流程图:

实现细节

动态策略管理后台:

  • 项目配置
  • 策略类型
  • 策略功能

分流策略控制中心:

  • 项目标识获取
  • 策略参数提取
  • 策略配置提取
  • 策略命中
  • 动态分流

灰度监控:

  • 策略控制中心异常监控
  • 灰度结果监控(业务监控等等)

异常处理:

  • 策略控制中心异常处理
  • 灰度结果异常处理

代码发布流程