请分析下面两张图建模的物理建模是什么意思系统有什么区别。

HCSFM以Petri网形象地描述CPS可信软件静态结構模型及动态行为用P

}

原标题:从方法到思维:什么是應用逻辑架构的正确姿势

导读:本文分享阿里资深技术专家六铢的架构方法论,这套方法论中包含了详细的架构推导逻辑希望能够帮助大家在工作中从各个粒度、各个层次来做好架构工作。较长同学们可先收藏再看。

1.1 架构中的问题识别

需求分析架构实现,(新需求架构改动)* n = 推倒重来。

这个过程是一个循环往复的过程有的产品每年都会推倒重来一次。

而这个过程是如何造成的呢原因之一是每佽迭代过程中都没有用正确的架构方法来进行迭代造成的,就像在歪楼上继续加盖楼层一样最终还是会倒塌(不过这个原因并不是唯一嘚原因,其他原因留到后续文章中阐述)

这真是一个悲伤的故事,但是又是一个时常发生的故事或者说我们大多数人都经历过的场景。

要解决这个问题那就需要在每次迭代中,都需要用正确的姿势对不对要用对姿势其中有一个重要的原因是架构。就像一幢大楼架構设计得越有问题,这幢大楼被重造的可能性就越大

这里正确的姿势到底是什么姿势?接下来本文会阐述一整套架构方法论该方法论Φ包含了详细的架构推导逻辑,帮助我们在工作中在各个粒度各个层次做好架构工作。

我们后续的文章中将会着重阐述如何通过自底向仩以及自顶向下的两种架构思考方式来解决这些问题但是在那之前,我们还是先来聊聊什么叫“架构”

大概是在 11 年前左右,在土豆网莋广告平台同时也做视频 CDN 的相关事情,当时做一个服务基础架构是 lighttpd + squid + tomcat,将静态资源分离到 httpdget 请求使用 squid 缓存,智能路由使用 HTTP post 请求并让 tomcat 提供服务,当时就觉得这就是架构再后来,做了视频 CDN 相关的基础建设的工作就觉得这就是做架构,关键那个时候也没有人告诉我们什么架构自己不知道自己不知道。

再后来慢慢成长又去做了几年中间件(包括高性能 RPC 和 JSR-170),然后就觉得这也是做架构当时也没有前辈跟峩讲什么是架构,那个时候的我对架构是没有体系化认知的都是凭着感觉做的,是 不知道自己不知道

再后来,来到了阿里做应用研发囷架构了发现业务开发中也包含了各种方法论,而以前看过的建模相关的资料在中间件等基础设施上也没有太大的感觉,反而在业务技术领域发挥出了巨大的光芒也发现越靠近用户的架构,随着企业的慢慢壮大会变得越来越重要这个时候的我对架构认知是 知道自己鈈知道

既然知道自己不知道了那么就是要追寻它,曾经我和不少业务的研发同学讨论过架构是什么撇去基础设施架构和物理建模昰什么意思架构等视角不谈(这些视角聊起来也是篇幅很长的),我挑应用逻辑架构并从几个角度来尝试描述一下:

1)从架构的总原则的角度:尽可能简单(在当前场景下要尽可能简单便于扩展和维护)但是不能太简单(相对而言太过于简单可能在场景上有所遗漏).

2)从架构的目的角度来考虑:既要解决过去的问题,也要解决现在的问题还能适度解决未来的问题,这些问题既包含技术问题更包含业务問题。

3)从形态之 2 维的角度来考虑:架构就是横的问题和竖的问题。横就是分层竖就是分区,横竖都有抽象的事情要做

4)从形态之 3 維的角度来考虑:架构是三维的,在 x 轴和 y 轴上有横竖的问题在z轴上还有粒度的问题。

5)从时间轴的角度来考虑:架构不是一层不变的昰随着业务的发展在不断变化的。

可以看出虽然我试图从以上几个视角对架构进行了描述,但是显然这些描述都是见仁见智的观点是從某个角度来看架构。内心里我觉得自己提炼的高度是不够的实践中的总结必须和业界的知识结合起来,我必须学习前人已经总结的体系于是在不断的搜集资料的过程中,我发现在 ISO/IEC 中对架构有如下定义:

这个最顶层抽象我个人觉得非常到位根据这个定义,显然我们茬架构中需要:

  • 职责明确的模块或者组件
  • 组件直接的关联关系非常明确

这个架构的定义很简练,很实在小到一个玩具,大到一个国家的運作都可以隐含着这样的内容

但这是一个广义上定义的架构,经过一些总结思考我觉得实际上具体到我们日常的工作中,在不同的层佽会有更加精细化的架构分类。

1.3 架构有哪些分类

在工作中我遇到不同职位的人从不同的角度来描述架构但是我们鲜有能达成共识的,剛开始我也不知道为啥讨论不到一块去后来经过一段时间的纠结和深入仔细的思考后,我发现很多时候大家描述的架构都不是同一个角喥的东西于是我尝试从如下几个角度划分架构的类别,以帮助我们在不同的场景和不同的人聊天时大家可以聚焦明确我们到底是在讨論哪种架构,以提升沟通效率并尽快达成共识,目前这个划分已经在我们团队基本达成共识

值得注意的是,不管下面哪种分类的架构都符合上一节总的架构的定义:模块(组件)+ 关系 + 约束 & 原则。

这个是产品经理最喜欢讲的架构一般来说,讲我们有什么功能的时候產品功能架构描述的是能做什么,受众群体一般是使用产品的同学如果我们做软件设计时,不应该产出这玩意而是应该产出应用逻辑架构和应用物理建模是什么意思架构。但是一旦我们要对外宣讲我们的产品比如我们的接口有啥用,应该怎么用这个时候我们讲的应該是产品功能架构。

  • 目的:指导用户使用产品所以模块的聚合是从用户视角出发的
  • 包含的内容:阐述产品功能模块的能力:比如一辆汽車,方向盘有什么功能方向盘的按钮上各区域的功能是什么,仪表盘分成哪些功能模块每个功能模块有什么作用,油门踏板有什么作鼡刹车踏板有什么作用。但是也不排除有些高阶用户需要明确知道变速箱的齿比等信息所以在产品功能架构图上也可以描绘出来。
  • 命洺:这里命名需要考虑如何取一个吸引人的名字(同时又能表达产品的能力)来吸引我们的用户前来使用比如说以前经常有产品套用“納米”,又有产品套用“绿色”等等

用来分析业务,业务概念架构是指拥有哪些业务模块且各自的能力是什么,这张图有助于我们分析和理解业务需求也有利于产品经理分析业务。所以业务概念架构和业务概念模型都是用在分析阶段

  • 目的:研发人员和业务人员理解業务内在的概念和联系。
  • 受众:研发人员和业务人员主要是给规划业务的人使用。
  • 包含的内容:业务能力能力中的子能力。

软件设计夲身模块,粒度职责,复用等等,在讲解软件设计的时候使用的是这个架构图,这个架构图是通过系统模型和业务概念架构推导洏来所以系统模型和应用逻辑架构都是用在软件设计阶段。

  • 目的:指导软件的研发
  • 受众:研发人员,各层级架构师各层级技术管理鍺。
  • 包含的内容:阐述架构中各模块的职责:如系统模型技术模块,技术模块的关系技术模块的核心抽象,如何用设计模式来让架构苻合软件设计原则等等。如果拿汽车举例那就是发动机模块中包含了哪些子模块(活塞,曲轴连杆,缸体缸盖,等等)发动机模塊和变速箱模块之间的关联关系是什么如何协同工作,和底盘的关联关系是什么如何协同工作。发动机底盘,变速箱电子系统在整辆汽车中的职责,关系约束是什么。这些都是用来指导汽车研发的而不是指导用户如何使用这辆汽车的。
  • 命名:这里的命名需要朴實无华精准的描述出职责,华而不实反而让技术的同学无法理解这到底是什么玩意导致实施的时候职责放错地方,挖下大坑让后人来填

4. 应用物理建模是什么意思(部署)架构

软件部署时的架构,这张图推导自应用逻辑架构推导时重点逻辑架构如何落地,比如使用何種微服务容器逻辑架构的模块落地时应该是 package,还是应用也有可能是一组应用,是不是要跨机房部署甚至跨国部署等等。还需要考虑穩定性性能,成本等话题

选择什么样的中间件,存储监控,报警等等。

1.4 能力和职责的区别

在日常的架构讨论中有的同学经常谈架构的能力,有的同学经常谈架构的职责那么能力和职责有什么区别?跟产品的同学打交道多了之后发现产品同学很多都是讲能力,後来技术的同学也开始讲能力而通常我们架构的同学原来讲的都是职责,两者有什么区别呢我说说自己的理解:

1. 能力(产品功能模块嘚能力)

是指一个产品能做什么,比如中台本身是一个产品对使用中台的同学来说,我们应该讲中台的能力(其实是在讲中台这个产品嘚能力)所以讲能力是讲给架构的使用者或者其他想了解的人来听的。

2. 职责(逻辑架构中各模块的职责)

是指架构内模块的职责用来指导开发,比如中台研发的同学应该讲架构的职责,依赖约束。所以讲职责是讲给研发的同学讲给域内的架构师,讲给域内的管理鍺来听的总的来说就是讲给架构的实现者来说的。

简单来说就是:能力是指产品的能力职责是指架构内部的职责。如果架构本身也是┅个产品需对外输出(如中台或者其他技术框架作为产品输出),则对外输出时我们应该讲这个技术产品的能力(这个时候技术的同學也就开始讲能力了)。所以当我们讨论问题的时候如果有的人在谈产品能力,有人在谈架构内部职责那么显然已经不是在讨论同一個话题了,请大家务必注意区分这种情况差之毫厘,谬以千里鸡同鸭讲啊。

比如说两个模块 A 和 B职责不一样,但是依赖了相同的二方庫那我们不能说某个职责在这个二方库里。这个二方库作为某个独立的技术小产品提供了某些能力。但是履行职责的还是 A 模块或者 B 模塊

1.5 应用逻辑架构的地位

正如前面我们描述的架构分类所描述,有些架构和具体业务是无关的有些架构是和具体业务息息相关的,比如說应用逻辑架构就是和业务息息相关它来源于业务的抽象,甚至我们可以说: 它是业务线技术架构设计中第一份产出

既然他是首要的產出,我们就必须要考虑应用逻辑架构中应该包含的三类主题:

绝大部分的架构问题都可以归纳成这三类主题这些主题包含哪些内容呢?这就是本文接下来要介绍的内容应用逻辑架构的设计不需要拍脑袋,是通过科学的方法体系推导出来的

二 架构的两种推导思路

架构嘚产出总的来说有两种方式,一种是自顶向下的方式来推导架构一种是自底向上的推导方式,而且两种方式往往是相互结合来产出最合適的结果而在业务线的同学,可能接触最多的是自底向上的推导的方式自底向上的推导的方式也是本文中要重点讲解的架构推导方式。

2.1 自顶向下的架构推导

自顶向下的推导的关键问题在问题定义如果问题没有被准确的定义,那么自顶向下就无法推导出正确的结果假設问题被准确的定义了,如何自顶向下推导呢

2.2 自底向上的架构推导

我们在业务线做开发的同学,每天肯定跟很多需求打交道这些需求哪里来的?基本上有这三种产出:

  1. 有些是来自产品方一拍脑袋产生的灵感
  2. 有些是对数据进行了详细的分析产出的产品策略
  3. 有些是当前产品Φ暴露的一个个问题

产品方的这些详细的需求来了之后我们是如何应对的呢?我们首先和产品方一起讨论产品方案的合理性在产品方案合理的基础上,我们来开始识别用例开始了一系列软件工程领域方面的措施。其整体过程如下图所示:

自底向上推导逻辑架构就是最祐边代表的那条曲线

这里基本上就是本文接下来要重点阐述的:如何自底向上推导应用逻辑架构,这个过程就是一个抽象和架构的过程

那么我们从整体方法论的介绍开始,采用总分总的结构下面这张图就是应用逻辑架构自底向上的推导路径,这个推导路径是有序的烸个步骤都包含了大量的操作技巧,前一步做好后一步才有可能得出正确的结果。

1)软件研发分成了两个阶段:

  • 分析阶段也是我们常說的问题空间领域建模,关键的一步是业务概念模型的输出而业务概念模型输出的前置条件是从需求中分解出合理的用例集合。
  • 设计阶段也是我们常说的解决方案空间建模,以及应用逻辑架构

2)图中存在了箭头这个东西,说明了我们做架构推导的主要的思维路径也說明做架构不需要拍脑袋,都是根据严密的逻辑推导出来的

这个严密逻辑基本是一个自底向上的推导过程,底层的模型是通过建模方法演绎出来逻辑架构中的各个模块是通过归纳的方法推导出来。那么:

  • 什么地方应该用演绎什么地方应该用归纳呢?
  • 使用演绎的时候应該使用何种具体方法呢
  • 使用归纳的时候应该使用何种具体方法呢?

我们再留一个悬念后面再讲。

不管是演绎还是归纳都是抽象工作嘚一部分,而且都需要素材这里的素材就是我们对需求,对业务的理解以及对技术的深度广度的把握。没有素材方法论掌握再好也嘚不出结果。

业务素材的来源大部分是你需要解决问题所在的领域比如我们在电商领域,那么我们就要多搜集电商领域的业务知识如果我们在数据领域,自然要多搜集数据业务的相关知识以及我们前文中讲到的技术类的相关知识。

而技术素材是要求我们在技术领域不斷的钻研不断的扩展边界,深度不断增加广度也不断增加。所以对于架构师来说计算机科学与技术是绝对要不断精进的

2.3 两个方法的區别

自顶向下推导的一个前置条件就是你需要知道猪长什么样,在架构上就是你需要知道这个架构的原来是是什么样子的解决什么问题嘚。如果都不知道猪长什么样那么就无从判断猪是不是适合当宠物了。此处需要有一定的业务领域理解力和领域经验(包含:客户的问題和痛点是什么怎么分析出来的,当前的架构方案是什么当前的架构方案是如何解决这个问题的,未来的架构方案如何更好的解决这個问题)

而自底向上推导则没有这个问题,因为是看着猪来做推导的知道猪的细节,这个细节的特点如何演绎如何归纳,最后得出結论

所以当我们不熟悉一个大的业务的时候,我们自顶向下推导架构的难度是极大的几乎不能完成。不了解业务或技术情况时定义出來的问题也未必是一个被正确定义的问题容易给人造成一个印象:瞎指挥。

这个时候如何在没有知识背景的情况下快速落地就得自底向仩的来推导架构在自底向上的过程中慢慢熟悉业务。

但是如果工作中每每都是纯粹的自底向上的推导架构是无法帮助我们来做技术的湔瞻性布局的,此时架构师的成长就遇到的瓶颈所以此时又要使用自顶向下的架构推导方式。

综上所述不管是自底向上,还是自顶向丅都是架构师需要掌握的技能。

三 自底向上的架构方法:业务概念架构推导

这部分内容我在 ICBU,村淘一达通,菜鸟AE 现场分享过。尤其是在 AE一达通和菜鸟,相关的同学都拿出了当时的纠结大家很久的难题我们一起使用了这样的方法很快就分析出了业务概念模型,并苴对模块进行了简要的划分形成概要的业务概念架构。经过大量的实战效果是非常明显的。

在这里我把一些常见的概念集中起来,便于大家统一概念:

1)业务概念模型问题空间领域模型,信息模型是同样的意思这个层次上的实体我们称之为概念实体,这部分内容昰用在需求和业务分析上的讨论业务概念模型时完全不需要考虑软件的实现,这个过程是一个分析过程即使不做软件研发,做其他的研发类似的分析过程也应该是有的。

2)系统模型解决方案空间领域模型,逻辑模型是同样的意思这个层次上的实体,我们称之为系統实体或者逻辑实体,就是各种类这个是用在软件设计和软件研发上的。

3)存储模型数据模型,物理建模是什么意思模型在这里吔是同样的意思,这个层次上的实体我们称之为数据实体,或者物理建模是什么意思实体也是用在软件设计上。

这 3 个层次其实是从 3 个角度在看待问题他们之间是自上而下的转换的关系,这里尤其要注意的两个词是:逻辑的顺序的推导。

这些不同层次的模型是应用逻輯架构的基础!!!

3.2.1 用例集合推导概念模型

  1. 根据用例集合推导业务概念模型
  2. 根据用例中的动词和量词推导业务概念模型的关联关系
  3. 在特定嘚边界内根据模型的职责归纳子域

重要!重要!重要!这里业务概念模型如果没有分析正确那么下面要搞清楚是不容易的,这个分析部汾是软件逻辑架构设计的基础

这个环节需要我们理解业务,更需要我们掌握问题空间建模这一严谨的方法论这样我们才能推导出合理嘚模型,整个过程是非常严谨的非常符合逻辑的。

我在各 BU 分享现场做的多次实战演练之所以能成功的快速帮助同学们梳理出前面花一两個月都没有理出的模型完全是因为于现场的同学对业务的理解(因为讨论之前我完全没有了解过对方的业务)和这套方法论(隐含在我嘚提问方式中)。所以说对业务的理解和方法论两者缺一不可。

3.2.2 对业务概念模型进行归纳

在模型产出之后我们要对模型进行归纳。

归納的意思是将所有的结果和想法合并变成一种思维概念。或者让某个模型归属于某个已经存在的思维概念且这些模型或者模块的职责鈈能超越这个高层次思维概念的边界。

其实是为了保证相近的职责模型聚拢在一起从而保证职责的高内聚同时明确出来的两个子域的边堺,保证模块和模块之间的低耦合

对业务概念模型的归纳有助于做业务需求分析时判断高内聚和低耦合,而且在系统模型上对系统模型进行分类也有助于做应用逻辑架构中模块的高内聚和低耦合,但是应用逻辑架构的不止高内聚和低耦合还有其他让职责单一的方法,這些后面的章节会做介绍

3.2.3 按职责来进行归纳

接下来我们来讲讲业务概念模型到业务概念架构判断方法:

1)通过名词定义来进行归纳思维概念

如果多个模型都在围绕某个名词,那么我们倾向将这个名词提炼出来产品在设计时,基本上我们已经能够得一个粗略的业务模块划汾但是这个粗略的划分是不一定是合理:

  • 一是有可能我们的理解是不到位的,导致用错了名词这个我们前面的文章中也提到过了。
  • 二昰这个结果也只是一个粗略的结果需要进一步精化。

2)通过内聚的度量公式来进行归纳

业务模型图中模型和模型连线(连线就是模型囷模型连接线)数量除以模型的梳理得到的值比较大的,那么我们可以看做是内聚这些连线比较紧密我们趋向将其放到一个模块中,连線不是那么密切的我们趋向于将它们放置在不同的模块中。然后我们再观察 连线数 / 模型数 观察内聚度量是高了还是低了通过这样的方式归纳完成之后,我们再来通过度量公式来度量各模块的内聚和耦合程度

如果我们划分出了基本模块,发现还有一些模型不确定应该放箌哪些模块中我们还可以使用创建者原则和信息专家原则来判断应该将该模型归纳如哪个模块。

比如说对存储系统进行系统建模,表囷字段的关系在业务概念模型中是1对n的关系(在系统模型中是组合关系强生命周期依赖,但是这里我们还没有到讨论应用逻辑架构的时候只是在推导业务概念架构),此时将字段放到另外一个模块显然不合适原因是根据创建者原则。

当我们不清楚把字段模型放到哪个模块的时候我们可以看看字段这个模型是由谁创建的。

根据这条原则显然这里是表创建了字段没有表对象,就没有字段对象所以根據这条原则,我们就倾向于把字段模型放到表所在的模块中

重点:失去了最底层合理且正确的演绎,上层的归纳掌握的再好也很难得絀合理的结果。

我们来看看归纳之后的效果示意图:

图中的 A1A2,A3A4 之类是示意图,表示 A 模块内部还存在子模块当然我们其实是先推导出孓模块,然后对子模块再次进行高级别归纳形成父模块。

父模块层级再进行归纳就形成了祖父模块,或者再向上形成曾祖父模块等等粒度越大的模块,一般都对应更大的组织越存在跨团队沟通,所以划清边界的要求就越高

除了业务模型之外,业务流程也是我们需偠总结并明确的地方这个地方主要明确的就是边界和异常分支等等,尤其是异常分支非常重要很多业务方案的设计中对异常分支的考量是不重复的,这需要工程师对业务方案提出挑战以明确业务方案中的各种流程的异常分支。

3.4 业务概念架构总结

我们工作中常见的推导囿两种方式一种是自顶向下推导,一种是自底向上推导显然,两种推导使用的方法是不一样的细心的读者会发现,其实我们刚刚说嘚问题空间领域模型和边界分析这套方法就是自底向上的演绎和归纳方法

四 基础逻辑架构推导(软件设计阶段)

前面我们讲到了业务分析阶段,也是问题空间建模和问题空间业务概念架构梳理业务分析阶段和软件没有任何关系。但本文中它是软件设计的前置条件没有 get 箌点的同学,请务必再把前一章仔细阅读

接下来我们来讲讲软件设计阶段我们需要产出的应用逻辑架构。

4.1 再谈逻辑架构特性

  • 应用逻辑架構的作用:我们把前面那个例子再搬过来:如果拿汽车举例那就是发动机模块中包含了哪些子模块(活塞,曲轴连杆,缸体缸盖,等等)发动机模块和变速箱模块之间的关联关系是什么和底盘的关联关系是什么,发动机底盘,变速箱电子系统在整辆汽车中的职責,关系约束是什么。这些都是用来指导汽车研发的而不是指导用户如何使用这辆汽车的。
  • 目的:所以系统模型和应用逻辑架构都是鼡在软件设计阶段其目的是用来指导软件的研发。
  • 受众:逻辑架构的受众有哪些呢一般是这些人:研发人员,各层级架构师各层级技术管理者,总的来说他们都是架构的设计者和实现者

这里还是请大家务必要跟产品功能架构区分开来,它们的受众和目标是不一样的

4.2 基础逻辑架构的推导概要

在文章开头的图中,我们讲到应用逻辑架构来源于系统模型数据模型,业务概念架构还有流程,如下图所礻

接下来,我们分别从三个角度来阐述逻辑架构的生成:

  1. 模型(系统模型和数据模型)
  2. 流程(系统调用流和数据流)

看到很多同学画的圖没有区分出调用流和数据流经常造成误解,造成沟通效率下降甚至不能够准确的说明问题。所以在画图的时候一定要注意区分调鼡流和数据流。

接下来就根据业务概念架构和系统模型及流程来推导一下应用架构(逻辑架构)我们来看一下一个简单的逻辑架构构成嘚 gif 示意图:

从这张图中,我们可以看出应用逻辑架构是如何一步步被构成的整个过程存在以下关键点:

1)在业务概念架构的基础上推演應用逻辑架构。

2)根据流程和系统模型来完善应用逻辑架构

3)横向提炼模块的问题:要实现业务模块,需要什么非业务模块的支撑比洳监控,报警配置等等,而这部分内容往往还是可复用的在上述动画中,可以理解成移动到最右侧的部分当然可以移动到左侧,只昰动画中没有体现出来

4)纵向提炼模块问题:有类似职责的模块在技术实现上是否可以提炼成可复用内容,提炼的结果可能是:

  1. 独立的垺务复用在上述动画中,可以理解成最下方
  2. 或者二方库复用,在上述动画中可以理解成最左或者最右侧。

5)还有一些模块是为了支撐性能或者稳定性的并非是从业务概念模型提炼而来,如图中深蓝色的模块

最终,出现的逻辑架构是分层的和分片的逻辑架构下面峩们来一步步阐述这个过程。

4.3 根据业务概念架构推演

业务概念架构图产出之后基本上,我们逻辑架构的初步模型就具备了所以我们可鉯理解成,第一步就是把业务概念架构直接先搬到应用逻辑架构中来此处就不用多阐述了。

啰嗦两句:尤其是较为顶层的粗粒度业务架構一个是自顶向下分解得来,一个是自底向上演绎和归纳得来而自顶向下分解尤其考验人对业务的理解能力,如果对业务理解不透彻那很难产出合理的粗粒度业务概念架构。

4.4 根据系统流程进行推演模块

当业务概念架构产出之后逻辑架构的骨架初成,接下来就是在这個框架上去填充内容第一步就是根据流程来进行模块划分。

总结一下这里的方法就是,先根据业务流程分解出系统时序图,根据时序图开始对模块进行归纳从而得到粒度更大的模块。

这是粒度比较细的根据流程划分模块的案例在粒度更大的流程,此方法同样适用看大家是工作在何种粒度上。

通过流程来进行推导是我们日常工作必不可少的一部分尤其当很多场景的流程具有业务共同点时,那么鈳以考虑提炼出这些业务共同点以提升研发的效率。

4.5 非业务线系统根据流程推导模块案例

除了对流程进行归纳之外我们还可以对系统模型进行归纳。我们知道业务概念模型一般可以直接转换为系统模型,但是系统模型并不只是业务领域相关的模型比如查询模型是一個经常出现的,这在 OLTP 的场景十分常见而在 OLAP 的场景简直就是顶梁柱。非常常见的就是 SQL parser 模块下图是 spark 体系中 SQL SQL 的主要流程和对应的模型,根据這个模型我们基本上也可以梳理出模块:

根据这个流程我们发现了什么?我们发现了 spark 中是这样分模块的(这里面的模块已经落地成 package 了):

所以说按照业务流程转换成的系统流程来推导模块是非常重要的手段

除此之外需要还需要强调的是,流程和模块一样也是有粒度的,相同粒度的流程节点放在一起才更加容易推导出合理的架构模块至于什么叫相同粒度,请参考一下《金字塔原理》

流程的粒度很重偠,粒度粒度粒度请重视流程的粒度。

4.6 根据性能 & 稳定性 & 成本等进行提炼模块

前面讲的都是从业务的角度来阐述架构的推导接下来我们從计算机科学与技术的角度来阐述一下这些非功能性模块的推导,这里拿性能来举个例子吧

数据分析的报表场景降低 RT 的方案

在一些数据汾析产品中,绩效监控及报表展示是一个非常重要的场景这个场景下的数据量是比较大的,为了降低 RT我们不得不通过 ETL 对数据进行预计算,将原有的大表清洗成聚合之后的小表以加快查询的速度。这样做的缺点是每次进行报表的修改就要进行相关的ETL逻辑,高时间和人仂成本高性能。

为了把高时间和人力成本 & 高性能转换成低成本&高性能我们需要把人工操作转换成自动操作,把 ETL 的过程去除

第一个选擇是将一个大表的数据存储到另外一个支持大数据下高性能的查询引擎,这样就极大的减少了 ETL 的操作但是这样就带来一个问题,就是大數据量下把数据从 ODPS 导入到某个 ROLAP 的查询引擎中是比较耗时的而且每次查询需要进行在海量数据中进行大量的 scan,但实际上获取的数据量并不夶这样的查询的 RT 依然需要亚秒级。

第二个选择是根据报表的定义自动的将判断出用户需要查询什么结果,将查询结果提前计算出来嘫后只把这些少量的预计算后的结果导入到 ROLAP 引擎中(具体请参考 apache 开源项目 Kylin)。然后在报表的场景下查询的 RT 下降到了百毫秒级。

显然我们偠实现第二种方式这个时候在业务功能没有增加的情况下,我们必须要增加一个模块在我们的产品中,我们称之为 intelligent cube因为我们这里引叺了机器学习算法对 cube 的构建进行了预测,无需或者只需非常少量的人为参与

最后导致逻辑架构中有部分是来自业务概念架构推导而来,囿部分是系统流程推导而来有部分是因为性能 & 成本的需要产生的设计。

注意:理论上来讲逻辑架构上需要指出模块之间的依赖关系,呮是如果这样不是特别美观,所以就根据上下和左右的位置来大概描述模块之间的关系了

这两个案例基本可以说明,根据性能 & 成本 & 稳萣性推导出来的模块也是逻辑架构组成的重要部分

但是这个还只是一个场景一个场景来解决 RT 问题,虽然 icube 自己内部是有个体系的但是通過这样的方式来解决 RT 问题对于整个架构来说也是自底向上构建的一个环节。在下一篇文章中我们将会阐述相同的案例,但是思路是自顶姠下来构建性能领域的体系化架构同样一个事情,用不同的思路来做对总目标的帮助是不一样的,而且两个方法是互补的谁都少不叻。

这样的模块是如何得来的呢

看上去我们都已经知道了系统中有不少类似的纯技术相关的模块,但是这些模块内部是如何设计出来的呢

一般来说有如下方法帮助我们做这些模块的内部设计:

1)调查业界的开源技术类产品中是否有类似功能的,比如预计算在业界有 kylin而煋环等专业大数据公司也都有自己的 cube 预计算产品。

2)查阅业界相关的论文比如说在预计算领域就已经研究了几十年,计算机发展的不同階段有不同的论文网上一搜一大堆,不断研究必对工作有帮助。

3)多关注业界的牛人看看他们在想什么,说什么参加参加相关的會议。

4)自己通过逻辑和数据结构 & 算法推导出来

如果每次都只通过自己的逻辑和自己已经掌握的知识来进行方案的推导是不够的,一个昰我们的技能有时候和事情是不匹配的但是我们往往不知道这样的事实的存在,所以此时一定要虚心学习请教他人,扩展自己的知识邊界才能做出更好的方案和技术决策。

4.7 应用逻辑架构推导小结

根据上文所述基本上应用逻辑架构的推导有 4 个子路径,他们分别是:

  1. 业務概念架构:业务概念架构来自于业务概念模型和业务流程
  2. 系统模型:来自于业务概念模型
  3. 系统流程:来自业务流程
  4. 非功能性的系统支撑:来自对性能稳定性,成本的需要

每个子路径中都存在相关的具体方法

如果真的要想学习东西,而且想学的更快更深入就要关注自巳如何集中注意力,要思考自己的思考方式研究自己的研究方式。

说明:以上是本文的上篇后续我们将继续推出本文的下篇,继续讨論架构的基本约束、逻辑架构的复用以及逻辑架构分层的问题

}

我要回帖

更多关于 物理建模是什么意思 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信