系统化思维在以前的文章中,有提到过很多。总结为三个方面。
1、系统三要素:元素、元素之间的关系、元素功能。
2、宏观与微观
3、系统动力学
以上三点是我在2020年之前,在对系统化思维的一个认识。以及将这三点运用到软件系统架构中的思考。
简单过一遍:
在软件系统架构的设计中。运用系统化思维的三大特色,可以有这么一种设计方法:
元素层:每个元素都是原子、独立性的。只做着单一职能。体现的是系统化思维中的三要素中二个功能,元素以及元素功能。
关系层:体现的是,多元素之间的关系,外加关系管理职能。体现的是系统化思维中的三要中二个功能,元素之间的关系。
业务层:业务层,参与了多元素,多元素之间关系的逻辑流程以及状态处理。
业务展示层:链接业务层,并将其适配各种终端。
这是一个极其简单的利用系统化思维的三要素进行架构设计的方法。
再将系统范围扩大、或者复杂度提升。那么有两个角度可以去思考。
1、每一个元素,又可以由一个系统构成。
2、几个领域内的元素或系统构成一个独立系统,我们可以将其称为领域。
那么现在来分析下,这样的架构存在的一些性质:
复杂度
这里面有两个特性:
1、系统架构越往下,其稳定性要求就越高,这里的稳定性是指,元素特性、功能稳定固化。
2、系统架构越往上,其灵活性要求就越高,这里的灵活性是指,需求的多变、快速响应。
可以看到架构图中,从微观到宏观的角度,可以理解为,业务层的展现,其实就是由底层元素,多元素之间相互合作等形成的。
若我们在系统架构中,将元素进行改变:(增加属性、改变某个属性),其产生的复杂度是由下往上传递的。
底层元素的改变,往上一层一层的传递,其复杂的影响将是一个乘数的改变。
那么如何保证业务层的灵活性呢,灵活性可以由元素的组合,逻辑流程的多少来保证。当然,在多变的需求下,可以增加一些元素,增加的元素,可以更加的为上层提供多样性,也就是灵活性。
还有一种常见的架构
1、中间层,是一个抽象的固定层,可以理解为固定流程、固定接口层,承接的是上下两层
2、上层,对接的是一个业务方
3、下层,对接的是另一个业务方
这里就又牵涉到另外一个词叫抽象
抽象
抽象的结果是什么?抽象的结果就是,固化、稳定。不管是流程的固化,稳定。还是功能、属性的固化和稳定。都是抽象带来的好处。
具象
相对比抽象的词便是具象,具象的代表的是具体实例,不同的实例应该都有不用的特性。这就具备了,抽象的一部分,又具备了一个部分的个性。
什么地方,什么层,采用抽象(固化、稳定),什么地方,什么层采用灵活。
根本在于整个系统的需求,或者理解为整个产品的需求。
分析系统、产品需求,其中抽象在哪里?具象又在哪里?
以上架构层的设计,已经足以涵盖当下,绝大多数的软件系统架构设计。
但其是不是存在问题?问题是没有的,但是有复杂度问题没有解决。
哪来的复杂度?
虽然有做分层,也有说到稳定与灵活的两个属性。
但元素多,关系多,业务流程多,反应到系统层面来讲,就是整个系统的复杂度的提升。
在以往的解决方案中,有利用到领域,将大系统划分为领域。或者将一些领域干脆抽象成中台(其实,大多数情况下,一个xx中台,可以将其归结为某一个领域)
总结为在现有的架构下,从两个方向去解决:
1、减少元素,元素少了是不是复杂度就少了?
2、减少元素之间的联系。
领域的方案,其实就是采用了这种方式去将复杂度降低。
但本质上来说,并未解决系统的复杂度问题,只是做到了减少复杂度。
这个问题其实,一直都困扰着我。
幸运的是,其实在很多其他地方,早就已经有了解决方案。
可以见我的文章 从网络演进看微服务演进
分布式与集中式
集中式与分布式
其两者的优点各不相同:
分布式:天然的与元素对应,其属性天然与功能固定、单一对应
集中式:天然的与业务逻辑、业务状态对应。
两者的处理优势非常的突出与明显。
这种模式在计算机领域里有很多的体现。
1、操作系统:对于操作系统来说,进程抽象成固定的,单一的行为。在用户层,有很多的进程。在中间层(接口层)所有的进程对于操作系统来说,展现的是固定化的一面。操作系统来说,其管理这些进程,是一个集中式的管理。
进程的流程与状态也都是固定化有限状态机。
2、k8s的调度:对于k8s来说,所有的任务抽象固定化成pod。而所有的pod对于k8s来说也都是固定化的。
这里面体现的两个方面:
固定化部分:通过抽象功能或属性。元素状态的有限状态的固定。
有了固定化部分,那么对于集中式管理来说,其只需要做的就是调度。
在文章 从网络演进看微服务演进 讲到的是另外部分,网络。
其中也体现了集中式与分布式的优势结合。
那么利用集中式与分布式的特性。
我预测下一代的系统架构,包括中台的的发展方向为:
在现有的系统架构中,将复杂的逻辑流程、状态管理,上升到业务层,做成编排管理。将元素层的逻辑链接完全去除。
这里面的好处在于:
1、利用集中式的管理方式,将实现集中式的统一管理,与元素的单一固定化功能。并去除掉元素之间的复杂状态和链接。
2、利用流程的定制化编排,实现业务流程的灵活性。将灵活性完全上升到业务层。
3、在一些固化的流程,可以输出一些通用性的通用方案。实现业务方一键接入。
最后:对于系统架构的认识,我认为,越来越应该上升到脱离计算机(语言,操作系统等)的束缚,放开思维。
以上只是简单的记录了下,自己的一些思考。由于篇幅,以及写作的仓促,并未有太多的详细描述。