10

再论环境标准化

 3 years ago
source link: https://mp.weixin.qq.com/s?__biz=MzAwOTU4NzM5Ng%3D%3D&%3Bmid=2455771989&%3Bidx=1&%3Bsn=29ab02600a5ccb4d1d210ebd5f57a5f3
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

好久没写文章了,今天简单总结一篇。前一段时间写过几篇持续交付的文章,围绕的问题还是一致性、环境配置管理、服务隔离等。最近有了一些新的体会。

第一个问题说说仿真环境,所谓仿真就是基本上接近线上环境,比如mysql和redis资源都和线上环境一致,系统部署也和线上基本一致的,只是对外隔离了,通过域名来区分。

如果QA环境和线上环境架构不太一致,那么仿真环境的存在非常有意义,对测试人员来说非常重要,这是最后一道把门锁;另外仿真环境也可用于灰度测试。

但由于仿真环境用的数据就是线上的,所以如果测试的时候产生一些脏数据,会让用户看到,这个情况我们就遇到了。

那么如何解决呢?目前想到的方法就是将仿真环境的核心数据(mysql和redis)独立出来,系统部署和线上保持一致,这样有两个好处,首先是仿真,其次数据是隔离的。

为了保障仿真环境的数据是较为真实的,可以定期将线上的数据同步到仿真数据库中,不过一些用户属性数据(比如手机号)需要清除,避免测试的时候干扰了真实用户(比如给他发短信)。

看上去很美好,但对于我们的系统来说,虽然目前有三种环境(QA、仿真、线上),但代码层面并没有很好的支持,隔离的不彻底,导致线上和仿真并没有完全区分,使用的配置也没有中心化(环境变量或集中配置文件),尤其是我们的job服务和admin服务,比如代码中有对于环境的判断,通过下面的伪代码就可以看出来了:

if (环境 == QA) {

} else {

}

相对比较好的做法是代码中不能有对于环境的判断,环境配置一体化(所有的配置可以从环境变量或集中配置文件中获取)。

从这个角度出发,支持真正的仿真环境迫在眉睫。

第二个核心问题是QA环境的使用,我们的QA环境有以下几个弊端:

首先不该测的代码被测试了,比如两个人分别开发v1,v2版本,测试团队只想测试v1,但目前的机制v1和v2都会merge到QA,导致测试的范围不一致,可能会有一些隐性问题。

其次目前的QA环境用于前后端联调,这说明QA服务于前后端和测试,没有做到隔离。

最后QA环境不是一个稳定的环境,因为有的时候为了排查问题,会直接在QA上调试(属于坏习惯),另外QA的代码一直在联调,测试在一个不稳定的环境测试。

目前想到的方法使用一个pre QA环境,主要用户前后端联调或排查问题,QA环境用于测试,merge的频率建议不要太高。

pre QA和QA除了代码部署不一致,数据和系统部署是一致的,但达到了隔离和稳定,缺点有两点:

首先就是merge复杂度变高,不仅要merge到pre QA还要merge 到QA。

其次如何保证 pre QA和QA代码是持续同步的,会不会有人忘记合并到pre QA了?

虽然看上去很美好,但改变了大家的工作方式(大家都习惯了),需要再看看合理性。

最后通过一张图说明:

640?wx_fmt=png


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK