前景

近期使用了k8s,目的主要是为了配置灰度环境,其次是降低服务器运维成本,下面简单介绍下灰度的策略

解决方案

1、接口以及网页,最简单粗暴的方法就是直接请求灰度相关的域名

2、在不更换接口域名的前提下,在请求原有生产环境的接口上带上一个灰度的标记,例如Cookie,通过k8s的路由机制,对请求的数据进行处理,如果遇到带有灰度标记的Cookie,就把这个请求转发到灰度的k8s服务里面

3、在不更换网页域名的前提下,在正常网页里面,每当用户刷新或者打开网页的时候,先判断此用户是否在灰度环境中,若在灰度环境中,强制加上灰度的标志(即Cookie),然后借由网页的机制进行301重定向,接着重复第2步的流程

4、定时任务处理的时候加上用户灰度环境的判断,只对当前环境的数据进行处理

5、消息队列,在发送消息队列的时候也需要对灰度环境进行判断,若是灰度环境的消息,则发送到灰度的队列里面,处理消息也同理

6、Mysql的binlog日志处理,由于灰度环境跟生产环境是公用一个数据库,此时这个日志信息处理只能跑一个,不能灰度跟生产环境同时跑,可以在代码中加上一个版本号,只有当灰度环境的版本号大于生产环境的,才在灰度环境中开启进程处理binlog日志

7、app升级(这里只讨论安卓版本的app,iOS比较复杂这里不展开讨论),app端请求版本接口的时候无需带上Cookie,只需要带上用户的ID,接口这边判断用户是否在灰度环境中,是的话则返回灰度环境下最新的版本号

8、小程序升级,由于小程序升级是在网页段进行升级的,这里类似第3点,判断用户是否在灰度环境中,是的话用灰度环境的小程序模板ID等信息提交小程序审核

9、做一套可以随时将用户拉入以及剔除灰度名单的功能(可结合redis处理)

小结

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