[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;垂直分割可以加入面向测试、面向布署的需求面向。
透过正交分解法这样的切割方式,可以减少开发人员每个象限所需要思考的关注点;并且表格象限式的分析设计,也减少开发人员遗漏某个关注点的可能性。不管是开发新系统、或是审视旧系统,都非常推荐开发人员尝试看看。