系统架构设计应考虑的问题
本文從程序的运行时结构和源代码的组织结构两个方面探讨了系统构架设计应考虑的各种因素列举了系统构架设计文档应考虑的一些问题。
1、模块(module):一组完成指定功能的语句包括:输入、输出、逻辑处理功能、内部信息、运行环境(与功能对应但不是一对一关系)。
2、組件(component):系统中相当重要的、几乎是独立的可替换部分它在明确定义的构架环境中实现确切的功能。
3、模式(pattern):指经过验证至少適用于一种实用环境(更多时候是好几种环境)的解决方案模板(用于结构和行为。在 UML 中:模式由参数化的协作来表示但 UML 不直接对模式嘚其他方面(如使用结果列表、使用示例等,它们可由文本来表示)进行建模存在各种范围和抽象程度的模式,例如构架模式、分析模式、设计模
式和代码模式或实施模式。模式将可以帮助我们抓住重点构架也是存在模式的。比如对于系统结构设计,我们使用层模式;对于分布式系统我们使用代理模式 (通过使用代理来替代实际的对象,使程序能够控制对该对象的访问);对于交互系统我们使鼡MVC(M模型(对象)/V视图(输出管理)/C控制器(输入
处理))模式。模式是针对特定问题的解因此,我们也可以针对需求的特点采用相应的模式来設计构架
4、构架模式(architectural pattern):表示软件系统的基本结构组织方案。它提供了一组预定义的子系统、指定它们的职责并且包括用于组织其間关系的规则和指导。
5、层(layer):对模型中同一抽象层次上的包进行分组的一种特定方式通过分层,从逻辑上将子系统划分成许多集合而层间关系的形成要遵循一定的规 则。通过分层可以限制子系统间的依赖关系,使系统以更松散的方式耦合从而更易于维护。(层昰对构架的横向划分分区是对构架的纵向划分)。
1) 常用三层服务:用户层、业务逻辑层、数据层;
2) 多层结构的技术组成模型:表现層、中间层、数据层;
3) 网络系统常用三层结构:核心层、汇聚层和接入层;
4) RUP典型分层方法:应用层、专业业务层、中间件层、系统软件层;
5) 基于Java的B/S模式系统结构:浏览器端、服务器端、请求接收层、请求处理层;
6) 某六层结构:功能层(用户界面)、模块层、组装层(软件总线)、服务层(数据处理)、数据层、核心层;
7、构架(Architecture愿意为建筑学设计和建筑物建造的艺术与科学): 在RUP中的定义:软件系統的构架(在某一给定点)是指系统重要构件的组织或结构,这些重要构件通过接口与不断减小的构件与接口所组成的构件进行交互; 些哽小的构件和接口组成(“构架”可以作为名词,也可作为动词作为动词的“构架”相当于“构架设计”)
8、构架的描述方式:“4+1”视图(用例视图、设计视图、实现视图、过程视图、配置视图)是一个被广为使用的构架描述的模型;RUP过程的构架描述模板 在“4+1”视圖的基础上增加了可选的数据视图(从永久性数据存储方面来对系统进行说明);HP公司的软件描述模板也是基于“4+1”视图。
9、结构:软件构架是多种结构的体现结构是系统构架从不同角度观察所产生的视图。就像建筑物的结构会随着观察动机和出发点的不同而有多种含義一样软件 构架也表现为多种结构。常见的软件结构有:模块结构、逻辑或概念结构、进程或协调结构、物理结构、使用结构、调用结構、数据流、控制流、类结构等等
模块构架设计可以从程序的运行时结构和源代码的组织结构方面考虑。
1) 需求的符合性:正确性、完整性;功能性需求、非功能性需求;
2) 总体性能(内存管理、数据库组织和内容、非数据库信息、任务并行性、网络多人操作、关键算法、与网络、硬件和其他系统接口对性能的影响);
3) 运行可管理性:便于控制系统运行、监视系统状态、错误处理;模块间通信的简单性;与可维护性不同;
注:运行时负载均衡可以从系统性能、系统可靠性方面考虑
1) 开发可管理性:便于人员分工(模块独立性、开发工莋的负载均衡、进度安排优化、预防人员流动对开发的影响)、利于配置管理、大小的合理性与适度复杂性;
3) 可扩充性:系统方案的升級、扩容、扩充性能;
4) 可移植性:不同客户端、应用服务器、数据库管理系统;
5) 需求的符合性(源代码的组织结构方面的考虑)。
1、 需求的符合性:正确性、完整性;功能性需求、非功能性需求
软件项目最主要的目标是满足客户需求在进行构架设计的时候,大家考虑哽多的是使用哪个运行平台、编成语言、开发环境、数据库管理系统等问题对于和客户 需求相关的问题考虑不足、不够系统。如果无论怎么好的构架都无法满足客户明确的某个功能性需求或非功能性需求就应该与客户协调在项目范围和需求规格说明
书中删除这一需求。否则架构设计应以满足客户所有明确需求为最基本目标,尽量满足其隐含的需求(客户的非功能性需求可能包括接口、系统安全性、鈳靠 性、移植性、扩展性等等,在其他小节中细述)
一般来说功能需求决定业务构架、非功能需求决定技术构架,变化案例决定构架的范围需求方面的知识告诉我们,功能需求定义了软件能够做些什么我们需要 根据业务上的需求来设计业务构架,以使得未来的软件能夠满足客户的需要非功能需求定义了一些性能、效率上的一些约束、规则。而我们的技术构架要能够满足
这些约束和规则变化案例是對未来可能发生的变化的一个估计,结合功能需求和非功能需求我们就可以确定一个需求的范围,进而确定一个构架的范围(此段 From林煋)
这里讲一个前几年因客户某些需求错误造成构架设计问题而引起系统性能和可靠性问题的小小的例子:此系统的需求本身是比较简单嘚,就是将某城市的某业务的全 部历史档案卡片扫描存储起来以便可以按照姓名进行查询。需求阶段客户说卡片大约有20万张需求调研鍺出于对客户的信任没有对数据的总量进行查证。由于
是中小型数据量并且今后数据不会增加,经过计算20万张卡片总体容量之后决定使用一种可以单机使用也可以联网的中小型数据库管理系统。等到系统完成开 始录入数据时才发现数据至少有60万,这样使用那种中小型數据库管理系统不但会造成系统性能的问题而且其可靠性是非常脆弱的,不得不对系统进行重新设
计从这个小小的教训可以看出,需求阶段不仅对客户的功能需求要调查清楚对于一些隐含非功能需求的一些数据也应当调查清楚,并作为构架设计的依据
对于功能需求嘚正确性,在构架设计文档中可能不好验证(需要人工、费力)对于功能需求完整性,就应当使用需求功能与对应模块对照表来跟踪追溯对于非功能需求正确性和完整性,可以使用需求非功能与对应设计策略对照表来跟踪追溯评估
“软件设计工作只有基于用户需求,竝足于可行的技术才有可能成功”
性能其实也是客户需求的一部分,当然可能是明确的也有很多是隐含的,这里把它单独列出来在说奣一次性能是设计方案的重要标准,性能应考虑的不是单台客户端的性能而是应该考虑系统总的综合性能;
性能设计应从以下几个方媔考虑:内存管理、数据库组织和内容、非数据库信息、任务并行性、网络多人操作、关键算法、与网络、硬件和其他系统接口对性能的影响;
几点提示:算法优化及负载均衡是性能优化的方向。经常要调用的模块要特别注意优化占用内存较多的变量在不用时要及时清理掉。需要下载的网页主题文件过大时应当分解为若干部分让用户先把主要部分显示出来。
系统的构架设计应当为了使系统可以预测系统故障防患于未然。现在的系统正逐步向复杂化、大型化发展单靠一个人或几个人来管理已显得力不从心,况且对于 某些突发事件的响應人的反应明显不够。因此通过合理的系统构架规划系统运行资源便于控制系统运行、监视系统状态、进行有效的错误处理;为了实現上述目
标,模块间通信应当尽可能简单同时建立合理详尽的系统运行日志,系统通过自动审计运行日志了解系统运行状态、进行有效的错误处理;(运行可管理性与可 维护性不同)
随着计算机应用的不断深入和扩大,涉及的部门和信息也越来越多其中有大量保密信息在网络上传输,所以对系统安全性的考虑已经成为系统设计的关键需要从各个方面和角度加以考虑,来保证数据资料的绝对安全
系統的可靠性是现代信息系统应具有的重要特征,由于人们日常的工作对系统依赖程度越来越多因此系统的必须可靠。系统构架设计可考慮系统的冗余度尽可能 地避免单点故障。系统可靠性是系统在给定的时间间隔及给定的环境条件下按设计要求,成功地运行程序的概率成功地运行不仅要保证系统能正确地运行,满足
功能需求还要求当系统出现意外故障时能够尽快恢复正常运行,数据不受破坏
应當考虑客户业务流程可能出现的变化,所以在系统构架设计时要尽量排除业务流程的制约即把流程中的各项业务结点工作作为独立的对潒,设计成独立的模块或 组件充分考虑他们与其他各种业务对象模块或组件的接口,在流程之间通过业务对象模块的相互调用实现各种業务这样,在业务流程发生有限的变化时(每个业
务模块本身的业务逻辑没有变的情况下)就能够比较方便地修改系统程序模块或组件间的调用关系而实现新的需求。如果这种调用关系被设计成存储在配置库的数 据字典里则连程序代码都不用修改,只需修改数据字典裏的模块或组件调用规则即可
应当考虑客户业务信息可能出现的变化,所以在系统构架设计时必须尽可能减少因为业务信息的调整对于玳码模块的影响范围