各种动物的寿命
在网上找了好久才找到了下面这张图,也有几张与这张类似的,但是内容相对不够完整。
动物最长寿命图(引自https://www.britannica.com/science/life-span)
此图主要展示了多种动物最长寿命,红色的为哺乳动物,绿色的是鸟类,蓝色的属于其他脊椎动物,橙色的归于无脊椎动物。对于每种生物来说,都有自己的最长寿命(上限);而各种生物内的单一生命个体也有自己的或长或短寿命时长。
在每种生物的有限的寿命中又存在若干个有序的生命阶段(或周期),例如蚂蚁的生命阶段分为:卵期、幼虫期、成虫期;人类的生命阶段包含:婴儿期、幼儿期、儿童期、青春期、成年期和老年期。不同的生物个体在自己的生命过程中,会按顺序经历包含属于自身的生命阶段集合,而且这些生命阶段是客观存在的。
基于上述内容的启发,在开展M项目开发过程中,需求方提到了一个“环境”的概念,进而“环境”又引申出了关于软件生命的问题,那么软件的生命在哪里呢?
我们先进行一些相关名词解释:
应用
应用与多个存在先后顺序的“环境”进行映射,这些“环境”共同组成了应用的完整生命周期。应用下的所有的版本都在这些“环境”中单向流转。
版本
类似于每个生物个体在自己生命阶段集合成长,版本也在所属应用映射的不同“环境”中单向流转。版本指的是一个内部功能构成部分稳定的含有代号的集合,可以基于版本进行实际部署或发布容器。
软件
指独立的软件包,软件可以在实际主机节点(包含物理和虚拟)上安装部署为实例。
镜像
指Docker仓库中或主机上保存的镜像,基于镜像可以发布为容器。
环境的特点
下面是我关于基于环境定义下的软件生命周期的一些思考。
1.环境是独立物理或逻辑分隔
“环境”之间彼此都是相对独立的物理(或逻辑)分隔关系,每个“环境”都是软件(镜像)的一个预先定义的生命阶段,这些阶段共同构成了软件的寿命,例如开发和测试环境。
每个“环境”之中又可以存在多个并列的“环境”子集,例如测试环境可以包含单元测试、容量测试、压力测试、手工测试等等。
2.环境间是单向有序的
“环境”之间是一系列存在单向前后承继顺序关系的阶段集合。之所以是单向的,是因为版本环境的先后顺序是相对稳定的且预先定义好的,例如测试环境不可能在开发发布之前存在。
存在某些“环境”个体之间前后顺序没有影响的情况,例如性能测试和可靠性测试之间前后顺序排列,并不影响正常项目计划的实施,但是在具体项目实施情况下,也必须定义其前后顺序。
用户可以定义“环境”的起始节点和结束节点。并且可以在这个顺序的环境链中创建插入或删除取消某个(些)“环境”节点,从而保证系统的可扩展性。类似于有限有向无环图(DAG, Directed acyclic graph)的形式。如下图所示:
有限有向无环图(引自https://en.wikipedia.org/wiki/Directed_acyclic_graph)
3.软件版本在环境间进行流转
由若干个环境“环境”预定义顺序的单向序列称之为流转过程,除了起始和结束的环境外,每个环境都有至少一个前向和后继环境;软件版本(或镜像版本,下同)在多个环境组成的流转过程中成功推送(软件生命继续)或失败驳回(单个软件版本的生命结束),形成了单个软件版本的寿命。
通常一个“环境”通过后,会向另一个或者几个后继“环境”(预先定义完成的拓扑关系)进行推送。后继“环境”将软件版本在本“环境”内处理(测试、调试等等),在过程中根据结果将版本推送(处理成功)或者驳回(失败)。一旦驳回,表明版本生命周期结束。可以认为每个版本类似于一个生命个体,在经历各个阶段的过程中进行成长,直至宿命的终点,这个终点可能在任意“环境”中。如下图所示:
软件生命周期示意图
4.环境中包含资源
每个环境中包含配置(环境变量、配置文件等)和外部服务(例如主机集群、负载均衡、文件存储)等,这些资源均可以被属于此环境下的软件(镜像)版本所发布的实例(容器)使用,而对于其他环境的实例(容器)封闭。