从系统稳定性的角度,开发人员可以随时变更开发环境,稳定性最差;测试环境供测试团队使用,或者研发之外的产品,运营团队来测试,验收,要有一定的稳定性;线上或者生产环境是面向真实用户的,稳定性要求最高。对线上环境的变更需要有一定的流程和规范。有些在上线之前还可以有一个预发布环境(staging),此环境是一个准生产环境,使用的资源都是线上的资源,只是服务入口对用户是隐藏的,一般是上线前内部评审使用的环境。这个功能也可以用测试环境代替,但是一般测试环境数据没有线上规范,可能会有部分效果看不到。
从用户的角度,环境可归类为线上和线下两部分。线上环境包含生产和预发布环境,线下环境包含开发和测试环境。开发者一般都需要本机开发调试,所以开发环境又可以多一个本地(local)环境。
最后可以组成一个本地,开发,测试,预发布和生产5个环境。不同的团队规模可以酌情全部使用,或者简化省略一部分环境。最简单的就是维护一个生产环境,开发直接变更生产环境,只是从团队协作和业务稳定的角度看风险非常高。
从团队协作的角度,系统迭代通常会涉及开发,测试,运维,产品/运营到最终的用户/客户。不同开发之间的工作最好不要互相影响,不同测试之间的工作也不要影响。同时开发最好也不要影响测试工作,反之亦然。因此我们可以在一个环境内细分为多个分组(sharding/group),分组之间可以共用一部分环境,但是在不同分组各自变更的部分是相互独立而不干扰。比如线上环境如果要支持A/B测试的话,那么也可以分为2个组,一个测试组和一个对照组。不同的开发按照不同的功能(feature)为分组各自独立开发、测试和上线。比如一个支付团队在迭代支付服务,电商团队在做购物车的迭代,购物车流程是要用到支付服务的。这时候电商团队和支付团队就可以在开发环境中分别为两个功能分组,各自开发,而不会因为支付团队也在开发状态而影响电商团队的迭代开发。
最后我们可以让不同的环境之间尽可能的保持相似或者一致,然后通过性能指标来调整资源分布,从而保持相似或者一致的前提下避免资源浪费。这样之后研发人员对各个环境会越来越熟悉,对于故障处理等紧急情况下的效率有很大的帮助。