[Architecture] 系统架构正交分解法
[Architecture] 系统架构正交分解法
前言
随着企业成长,支持企业业务的软件,也会越来越庞大与复杂。当系统复杂到一定程度,开发人员会发现很多系统架构的设计细节,很难有条理、有组织的用一张大蓝图去做分析设计。先前在InfoQ上看到一篇文章:「亿级用户下的新浪微博平台架构 - 卫向军」,在这篇文章里使用正交分解法,来分析设计新浪微博平台的系统架构。
透过正交分解法这样表格式的条列与分解,可以让开发人员清楚理解每个象限的关注点,进而去理解与组织整个系统架构所使用到的框架技术。本篇文章介绍如何使用正交分解法来分析设计系统架构,主要为自己留个纪录,也希望能帮助到有需要的开发人员。
水平分层
使用正交分解法来分析设计系统架构,要先拆解出水平分层。水平分层的拆解方式,开发人员可以依照N-Tier的切割方式来拆解水平分层。在本篇文章的后续范例里,使用经典的三层式体系结构来拆解水平分层:
表示层(Presentation):表示层用来分类与组织,系统所提供的功能接口。这边所定义的功能接口,会有两种概念,一种是给人使用的功能接口,一种是给计算机看的功能接口。例如一个对帐系统,可能提供HTML页面给用户使用、也可能提供RESTful API给其他系统调用。这些功能接口的分析、设计、实作,会被归类到表示层的象限范围。
领域层(Domain):领域层用来分类与组织,系统所提供的领域逻辑。软件是用来处理特定领域的问题,每个软件透过程序代码将问题的解决方案,封装成为函式库或是一组对象来提供系统使用,这些也就是所谓的领域逻辑。这些领域逻辑的分析、设计、实作,会被归类到领域层的象限范围。
存取层(Accesses):存取层用来分类与组织,系统所使用的存取媒介。系统运作的过程中,需要将一些参数、纪录、数据...等等讯息,持久化的保存到数据库以利后续使;或是需要从其他系统中取得这些相关讯息来进行处理。这些存取媒介的分析、设计、实作,会被归类到存取层的象限范围。
垂直分层
传统上,将系统依照特性与范围来拆解出N-Tier的架构之后,就可以开始着手进行每个Tier里面功能模块的分析设计。但使用正交分解法来分析设计系统架构,拆解出水平分层之后,还要接着拆解出垂直分层。垂直分层的拆解方式,开发人员可以依照不同的需求面向来拆解垂直分层。在本篇文章的后续范例里,使用「亿级用户下的新浪微博平台架构 - 卫向军」里的几个需求面向来拆解垂直分层:
技术架构:技术架构用来分类与组织,面向平台需求的功能模块。系统里不牵扯领域逻辑、平台级重用的功能模块,会被分类到技术架构这个垂直分层。例如:一个自定义的WebAPI框架,包含了Token登入、数据加密、Route分派等等功能,这些功能属于不牵扯领域逻辑、并且可以做为平台反复提供其他功能模块使用。这些功能模块、框架、策略,会被归类到技术架构的象限范围。
应用架构:应用架构用来分类与组织,面向领域需求的功能模块。系统里封装领域逻辑、互相交互的功能模块,会被分类到应用架构这个垂直分层。例如:一个商城系统里会包含了,订单追踪、客户数据、商家评价等等功能模块,这些功能模块封装系统的领域逻辑,并且互相交互。这些功能模块、框架、策略,会被归类到应用架构的象限范围。
监控架构:监控架构用来分类与组织,面向维运需求的功能模块。系统里不牵扯领域逻辑、封装监控逻辑的功能模块,会被分类到监控架构这个垂直分层。例如:一个RPC监控模块,包含了RPC响应时间、RPC每秒负载等等功能,这些功能属于不牵扯领域逻辑、并且封装了监控逻辑。这些功能模块、框架、策略,会被归类到监控架构的象限范围。
01.技术架构x表示层
「技术架构x表示层」这个象限里,开发人员可以把关注点放在:不牵扯领域逻辑、平台级重用、用于表示层。以上述关注点去发想,可以发想出不管是选择ASP.NET MVC或是Spring MVC来开发系统的表示层,都免不了会依照系统或企业的需求与特性,去精炼出自己的表示层框架,用来提高系统的产量与产值。类似像这些功能模块、框架、策略,会被归类到「技术架构x表示层」的象限范围。在本节的后续说明里,介绍一些常见的功能模块、框架与策略:
WebSite框架:WebSite框架封装了Route分派、Passwod验证、Cookie验证、OAuth验证、Model串行化\反串行化、HTML渲染...等等功能。这个WebSite框架,支撑「应用架构x表示层」里的功能模块开发HTML Page给外部用户使用。并且该框架开放接口让「监控架构x表示层」,能够监控WebSite的响应时间、在线人数、热门页面等等信息。
WebAPI框架:WebAPI框架封装了Route分派、Passwod验证、Token验证、Model串行化\反串行化...等等功能。这个WebAPI框架,支撑「应用架构x表示层」里的功能模块开发REST API给外部系统使用。并且该框架开放接口让「监控架构x表示层」,能够监控WebAPI的响应时间、每秒负载、错误纪录等等信息。
02.技术架构x领域层
「技术架构x领域层」这个象限里,开发人员可以把关注点放在:不牵扯领域逻辑、平台级重用、用于领域层。以上述关注点去发想,可以发想出在领域层里的每个功能模块之间的互相交互,需要建立平台级的分布式框架来提供:服务管理与执行、队列等候、排程执行等等功能,用来提高系统的产量与产值。类似像这些功能模块、框架、策略,会被归类到「技术架构x领域层」的象限范围。在本节的后续说明里,介绍一些常见的功能模块、框架与策略:
服务管理框架:服务管理框架封装了服务注册、服务查询、服务心跳...等等功能。这个服务管理框架,支撑「应用架构x领域层、表示层」里的功能模块,获取相依功能模块的联机信息与存活状态。并且该框架开放接口让「监控架构x领域层」,能够监控功能模块的服务数量、存活状态等等信息。
服务容器框架:服务容器框架封装了供应端建立、消费端建立、同步调用、异步调用、错误处理...等等功能。这个服务容器框架,支撑「应用架构x领域层」里的功能模块,建立供应端来提供远程服务。支撑「应用架构x领域层、表示层」里的功能模块,建立消费端来调用远程服务。并且该框架开放接口让「监控架构x领域层」,能够监控功能模块的响应时间、每秒负载、错误纪录等等信息。
消息队列框架:消息队列框架封装了建立队列、发送消息、取得消息、分发策略...等等功能。这个消息队列框架,支撑「应用架构x领域层」里的功能模块,建立消息队列来循序处理消息。支撑「应用架构x领域层、表示层」里的功能模块,建立发送端来发送消息到消息队列。并且该框架开放接口让「监控架构x领域层」,能够监控消息队列的处理时间、每秒负载、队列堆积数量等等信息。
排程作业框架:排程作业框架封装了建立作业、定时执行作业、定期执行作业、错误处理...等等功能。这个排程作业框架,支撑「应用架构x领域层、表示层」里的功能模块,建立排程执行的作业来调用服务或是发送消息。并且该框架开放接口让「监控架构x领域层」,能够监控排程作业的处理时间、执行纪录、错误纪录等等信息。
03.技术架构x存取层
「技术架构x存取层」这个象限里,开发人员可以把关注点放在:不牵扯领域逻辑、平台级重用、用于存取层。以上述关注点去发想,可以发想出在存取层里为了因应大量用户的问题,需要提供平台级的大并发策略与框架,用来增加存取效能、回避存取效能瓶颈。类似像这些功能模块、框架、策略,会被归类到「技术架构x存取层」的象限范围。在本节的后续说明里,介绍一些常见的功能模块、框架与策略:
资料存取框架:数据存取框架封装了数据库联机、数据分页策略、数据索引方针...等等功能。这个数据存取框架,指引「应用架构x存取层」里的储存媒介,如何进行数据存取的相关设计。支撑「应用架构x领域层」里的功能模块,透过框架功能来新删修查储存媒介。并且该框架开放接口让「监控架构x存取层」,能够监控数据存取框架的查询效能、数据负载等等信息。
资料快取框架:数据快取框架封装了数据快取策略方针、快取建立、快取使用、快取清除...等等功能。这个数据快取框架,指引「应用架构x存取层」里的储存媒介,如何进行数据快取的相关设计。支撑「应用架构x领域层」里的功能模块,透过框架功能来建立与使用L1\L2快取数据。并且该框架开放接口让「监控架构x存取层」,能够监控数据快取框架的快取命中率、快取负载等等信息。
读写分离框架:读写分离框架封装了读写分离策略方针、读写分离新增、读写分离查询...等等功能。这个读写分离框架,指引「应用架构x存取层」里的储存媒介,如何进行分表分库的相关设计。支撑「应用架构x领域层」里的功能模块,透过框架功能来新删修查被分割的储存媒介。并且该框架开放接口让「监控架构x存取层」,能够监控读写分离框架的查询效能、数据负载等等信息。
分库分表框架:分库分表框架封装了分库分表策略方针、分库分表新增、分库分表查询...等等功能。这个分库分表框架,指引「应用架构x存取层」里的储存媒介,如何进行分表分库的相关设计。支撑「应用架构x领域层」里的功能模块,透过框架功能来新删修查被分割的储存媒介。并且该框架开放接口让「监控架构x存取层」,能够监控分库分表框架的查询效能、数据负载等等信息。
04.应用架构x表示层
「应用架构x表示层」这个象限里,开发人员可以把关注点放在:封装领域逻辑、应用表示层。系统里所封装的领域逻辑,需要透过这个象限的封装,才能开放给外部系统或是用户使用。开发人员可以依照领域逻辑的面向,来分类与组织表示层所封装的功能模块。这些功能模块会使用「技术架构x表示层」所提供的框架,来建立REST API或是Web Page给外部系统与用户使用。并且使用「技术架构x领域层」所提供的功能模块,来调用「应用架构x逻辑层」里所封装的领域逻辑。
05.应用架构x领域层
「应用架构x领域层」这个象限里,开发人员可以把关注点放在:封装领域逻辑、应用领域层。系统里提供的所有领域逻辑,都会被封装成为这个象限里一个一个的功能模块。开发人员可以依照领域逻辑的面向,来分类与组织领域层所封装的功能模块。这些功能模块会使用「技术架构x领域层」所提供的框架,来提供与使用领域逻辑。并透过「技术架构x存取层」所提供的功能模块,来存取「应用架构x存取层」里所的持久化资料。
06.应用架构x存取层
「应用架构x存取层」这个象限里,开发人员可以把关注点放在:数据持久化、应用存取层。系统里所有领域逻辑执行过程所产生的持久化数据,都会被储存在这些象限里。开发人员可以依照系统的需求,来选择储存媒介的类型。这些储存媒介,透过「技术架构x存取层」所提供的策略方针来设计规划。并且透过「技术架构x存取层」所提供的功能模块,让「应用架构x领域层」能够存取位于媒介内的持久化数据。
07.监控架构x表示层、逻辑层、存取层
「监控架构x表示层、逻辑层、存取层」这个象限里的功能模块,依照「技术架构x表示层、逻辑层、存取层」对应层级所开放的接口,来监控对应功能模块的各项参数。例如:监控「技术架构x表示层」里WebSite框架的响应时间、在线人数、热门页面等等信息。以监控平台的设计来说,从技术架构的层面切入,尽量减少对于应用架构的侵入,可以有效降低应用架构的复杂度,进而增加系统的产值与产能,并且也不会减少系统监控的相关能力。
结语
正交分解法将系统架构切割为水平的N-Tier、与垂直的需求面向,再去交互切割组合每个象限的不同关注点。并且依照项目需求,还可以做更复杂的条件扩充。例如:水平分层可以加入提供Mobile、HTML5 SPA的Tier;垂直分割可以加入面向测试、面向布署的需求面向。
透过正交分解法这样的切割方式,可以减少开发人员每个象限所需要思考的关注点;并且表格象限式的分析设计,也减少开发人员遗漏某个关注点的可能性。不管是开发新系统、或是审视旧系统,都非常推荐开发人员尝试看看。
参考数据
[Architecture] 系统架构正交分解法的更多相关文章
- 【译】x86程序员手册10 - 第4章系统架构
1.1.2 Part II -- Systems Programming 系统编程 This part presents those aspects of the architecture that ...
- (二)ROS系统架构及概念 ROS Architecture and Concepts 以Kinetic为主更新 附课件PPT
第2章 ROS系统架构及概念 ROS Architecture and Concepts PPT说明: 正文用白色,命令或代码用黄色,右下角为对应中文译著页码. 这一章需要掌握ROS文件系统,运行图级 ...
- PetShop的系统架构设计
<解剖PetShop>系列 一.PetShop的系统架构设计 http://www.cnblogs.com/wayfarer/archive/2007/03/23/375382.html ...
- Windows Internals学习笔记(二)系统架构
参考资料: 1. <Windows Internals> 2. http://bestcbooks.com 3. Windows Drive Kit 4. Microsoft Window ...
- petshop4.0 具体解释之中的一个(系统架构设计)
前言:PetShop是一个范例,微软用它来展示.Net企业系统开发的能力.业界有很多.Net与J2EE之争,很多数据是从微软的PetShop和Sun的PetStore而来.这样的争论不可避免带有浓厚的 ...
- petshop4.0 其中详细解释(系统架构)
前言:PetShop它是一个例子.微软用它来展示.Net容量企业系统开发.业界有很多.Net与J2EE争议.微软许多数据PetShop和Sun的PetStore从.这样的争论是不可避免的带有强烈的商业 ...
- 互联网DSP广告系统架构及关键技术解析
互联网DSP广告系统架构及关键技术解析 宿逆 关注 1.9 2017.10.09 17:05* 字数 8206 阅读 10271评论 2喜欢 60 广告和网络游戏是互联网企业主要的盈利模式 广告是广告 ...
- DSP广告系统架构及关键技术解析(转)
广告和网络游戏是互联网企业主要的盈利模式 广告是广告主通过媒体以尽可能低成本的方式与用户达成接触的商业行为.也就是说按照某种市场意图接触相应人群,影响其中潜在用户,使其选择广告主产品的几率增加,或对广 ...
- 图数据库 Nebula Graph 的数据模型和系统架构设计
Nebula Graph:一个开源的分布式图数据库.作为唯一能够存储万亿个带属性的节点和边的在线图数据库,Nebula Graph 不仅能够在高并发场景下满足毫秒级的低时延查询要求,而且能够提供极高的 ...
随机推荐
- SikuliX简介及安装
一.简单介绍 SikuliIDE和Sikuli Script就是现在的SikuliX,最新版本是SikuliX1.1.0, 部分兼容Sikuli JAVA API,支持Python和Ruby,Siku ...
- python守护线程
如果你设置一个线程为守护线程,就表示你在说这个线程是不重要的,在进程退出的时候,不用等待这个线程退出.如果你的主线程在退出的时候,不用等待那些子线程完成,那就设置这些线程的daemon属性.即在线程开 ...
- 学习3ds max插件开发过程中的一些小结
1. 3ds max是以树状结构来管理整个场景的,每个树节点类型为INode 2. Interface类很关键,可以通过其中的GetRootNode.NumberOfChildren和GetChild ...
- OpenCASCADE DataExchange DWG
OpenCASCADE DataExchange DWG eryar@163.com Abstract. DWG is a file format created in the 70’s for th ...
- 深入学习jQuery选择器系列第四篇——过滤选择器之属性选择器
× 目录 [1]简单属性 [2]具体属性 [3]条件属性 前面的话 属性过滤选择器的过滤规则是通过元素的属性来获取相应的元素,对应于CSS中的属性选择器.属性过滤选择器可分为简单属性选择器.具体属性选 ...
- ASP.NET MVC之文件上传【一】(八)
前言 这一节我们来讲讲在MVC中如何进行文件的上传,我们逐步深入,一起来看看. Upload File(一) 我们在默认创建的项目中的Home控制器下添加如下: public ActionResult ...
- android跟服务器使用json传递数据
最近在做项目,使用了json传递数据,把服务器对象转换成json字符串返回,android使用gson包解析json字符串变成对象. 1.服务器代码编写,我这边是在servlet里面 Peron pe ...
- 搭建GoldenGate的单向复制环境
配置环境: 建议在相同版本OGG(即Oracle GoldenGate)之间进行复制,我在这里之所以选择不同版本的OGG,便于后续的比较学习. 一.准备OGG的运行用户 在这里,我直接使用oracle ...
- Oracle数据库全球化
一.自定义数据库和各个会话的语言相关行为 1.1 全球化功能 1.2 使用全球化支持功能 二.使用数据库和NLS字符集 2.1 语言排序与选择 2.2 Locale Builder 2.3 使用时区 ...
- Anliven - 一碗毒鸡汤
什么是你的核心动力,支撑着你持续前进? 什么是你的加速度,激发你全部的潜能和勇气? 你的核心动力应该来自于: 家人与朋友的信任.包容与期待 你本应承担的责任 对自己有所要求,有所期待,你本应更好 而你 ...