灰度环境也可称为线上仿真环境或者预发布环境,在上线之前发布到灰度环境,通过后再上线,其实灰度环境的好处挺多的,其中最明显的就是观察用户反馈,即时调整产品的方向,避免因为直接上线导致用户一时半会儿适应不了新系统,导致用户流失。此外还有助于降低上线的成本,如人力成本(一般大版本上线是深更半夜,开发比较疲惫)、降低bug数量等,如果发现灰度环境的问题,可以及时把用户剔除灰度名单,尽可能减少用户的损失

灰度搭建处理方案

  • 1、接口以及网页,最简单粗暴的方法就是直接请求灰度相关的域名,可以通过本地host或者DNS服务器域名解析从而访问到灰度环境,给到的不一定是真实的IP地址(中间经过了nginx、注册中心等架构需要配置环境)
  • 2、在不更换接口域名的前提下,在请求原有生产环境的接口上带上一个灰度的标记,例如Cookie,对请求的数据进行处理,如果遇到带有灰度标记的Cookie,就把这个请求转发到灰度的服务里面
  • 3、在不更换网页域名的前提下,在正常网页里面,每当用户刷新或者打开网页的时候,先判断此用户是否在灰度环境中,若在灰度环境中,强制加上灰度的标志(即Cookie),然后借由网页的机制进行301重定向,接着重复第2步的流程
  • 4、定时任务处理的时候加上用户灰度环境的判断,只对当前环境的数据进行处理
  • 5、消息队列,在发送消息队列的时候也需要对灰度环境进行判断,若是灰度环境的消息,则发送到灰度的队列里面,处理消息也同理
  • 6、Mysql的binlog日志处理,由于灰度环境跟生产环境是公用一个数据库,此时这个日志信息处理只能跑一个,不能灰度跟生产环境同时跑,可以在代码中加上一个版本号,只有当灰度环境的版本号大于生产环境的,才在灰度环境中开启进程处理binlog日志
  • 7、app升级,app端请求版本接口的时候无需带上Cookie,只需要带上用户的ID,接口这边判断用户是否在灰度环境中,是的话则返回灰度环境下最新的版本号
  • 8、小程序升级,由于小程序升级是在网页段进行升级的,这里类似第3点,判断用户是否在灰度环境中,是的话用灰度环境的小程序模板ID等信息提交小程序审核
  • 9、做一套可以随时将用户拉入以及剔除灰度名单的功能(可结合redis处理)

注释:灰度环境与线上代码是隔离的,但是共用一套架构,往往不单是数据库,MQ、定时任务等都需要兼容,所以灰度环境产生的垃圾数据跟账号绑定,不会影响线上的使用,脏数据可删可不删。