21大软件架构特点的全面解析

24 篇文章 2 订阅
16 篇文章 0 订阅

来源:21大软件架构特点的全面解析 (qq.com)

众所周知,架构特点多以"ility"结尾(例如 scalability、deployability),也被称为 NFR(非功能需求)、质量属性。架构的特点没有固定清单,但标准是有的,就是 ISO25010:

我们从业务需求(业务特征)、我们期望的系统运营方式(运营特征)中总结出这些特点,它们是隐式的、贯穿各领域,是架构师在字里行间能看出来的特点。《软件架构基础》书中的这张表是隐藏特点的一个例子。

《实践中的软件架构》一书中对架构特点解释得很清楚。

刺激的来源(Source of Stiumulus)可以是角色、触发事件的东西等。刺激(Stimulus)是实际产生的事件。环境(Environment)代表事件发生的系统条件。工件(Artifact)是系统中正在被刺激的部分。响应(Response)就是工件在我们应该度量(measure)的刺激下的行为方式。背景了解完毕,让我们来看具体的特点。

1性能

根据 Smith 所说,“性能是指响应能力:响应特定事件所需的时间,或给定时间间隔内处理的事件数”。性能可以有以下指标:

  • 延迟 。表示获得响应之前经过的时间,这里指的是一段时间。我们有最小延迟(开始时间)和 截止日期 (结束时间)。衡量延迟的其他因素包括 优先级(我们在其中查看响应的顺序)和 抖动 (随时间观察到的延迟波动)。

  • 吞吐量。是指在固定时间间隔内获得的响应数。但为了提高精度,我们应该度量多个时间间隔。

  • 可用容量。以上度量的结合体。在不超出延迟要求的情况下可实现的最大吞吐量。

  • 可调度的利用率。利用率是资源繁忙时间的百分比,而可调度的利用率是满足一定时间要求的最大利用率。

  • 数据丢失。如果使用缓存来提高性能,那么缓存未命中将成为性能指标。

 提高性能的技术

首先我们要了解影响性能的因素。

  • 需求 。我们需要多少资源?

  • 硬件 。我们需要什么类型的资源?比如 CPU、内存、I/O 设备、网络等。系统是否运行在正常条件下?还是在重负载下?

  • 软件 。我们使用的框架是否是高性能的?有没有使用缓存?是否涉及某种反射(java)?是否做了最大的优化工作?

我们需要控制需求,为此我们可以使用队列、节流和背压机制。通过改进算法,我们可以减少资源需求。通过设置最大响应时间(超时)和某种优先级,我们可以进一步控制需求。

可以使用垂直缩放来获得更好的响应时间。提高性能的另一种方法是并发。还需要注意阿姆达尔定律。

加速效果的瓶颈是程序的串行部分。例如,如果 95%的代码可以并行化,则并行计算的理论最大加速比将是 20 倍。

限制你的资源、对所有内容(线程、队列)实施固定的生产限制、规划资源使用并尽可能避免争用……这些说起来容易,做起来难。还可以充分利用缓存、水平缩放、添加多个处理单元等。

你应该了解你的框架和你的数据库,并优化它们。

2可靠性

根据《牛津词典》,可靠意味着质量或性能始终如一,且能够被信任。可靠性可以用平均故障间隔时间(MTBF)来表示,可靠性 =exp(-t/MTBF)。

可靠性很难用数字度量。我们可以用一些软件指标衡量复杂度和代码覆盖率,以了解可靠性的边缘情况。适应度函数也可用于度量可靠性。未解决问题的数量、成功的构建和部署的数量也是一些可用指标。ISO-9001 是衡量可靠性的另一种方法。

https://sergiuoltean.com/2020/04/29/fitness-functions/

 提高可靠性的技术

遵循最佳工程实践将产生更好的产品。使用更好的管理实践和流程,可以实现更高的可靠性。突变测试技术会让系统考虑边缘情况。混沌测试是提高可靠性的另一个重要工具。总之我们要强化系统来提高可靠性。

3可用性

表示可用系统时间与总工作时间的比率。这是可靠性之上的另一层。它是系统掩盖或修复特定阈值(例如时间间隔)内故障的能力。可用性可以表示为

MTBF= 平均无故障时间;MTTR= 平均修复时间

于是我们计算出下表:

提高可用性的技术

为了提升它,首先我们需要检测潜在的故障。

检测到异常情况后,我们可以进行干预。

4弹性

弹性指的是系统遇到问题时可以降级(而非中断服务),等待问题修复完成,表示的是系统在遇到严重故障时的持续运行能力。为实现弹性,需要提前设置防御机制(断路器模式)。弹性有时被称为容错性 。弹性系统指的是可以适应压力并持续运行的系统。很难用数字指标来度量弹性。

 增强弹性的技术

首先是确定潜在风险:系统有哪些关键功能?哪些硬件至关重要?然后我们需要实施保护策略,为此需要检查哪些事件可能导致这些重要部件发生故障。找出风险因素后就需要确定容忍阈值。具体的保护策略包括对请求数和线程数施加限制、缓存相同的请求、批量发送请求等。

5可信赖性

它包括可靠性可用性弹性可持续性 (可用性 / 弹性的比值)、可恢复性 (弹性函数)和 稳健性 (可靠性函数)。我们应该始终将它们视为一个整体。

拿一辆汽车来说,如果它是新车并且是知名的可靠品牌(例如梅赛德斯),我们可以说它是可靠的。它有备用轮胎,所以有一些可用性。四轮驱动意味着弹性,其中两轮出故障还有两轮能工作(但性能会下降)。可持续性是可用性(备用轮胎)和弹性(四轮驱动)的综合。健壮性在这里可以指道路通过能力。如果汽车是电动的,那么充电速度就是一个可恢复性指标。

6可伸缩性

它是系统在重负载下在可接受的阈值内的执行能力。它分为手动和自动可伸缩性两种,后者也叫 灵活性 。当负载突增时,系统会做出反应并水平缩放(添加 / 删除更多实例)。我们可以查看 CPU 和内存来观察这些突发事件。这些突发操作完成后,系统将杀死不必要的实例,从而降低成本。垂直伸缩意味着我们向系统添加了更多物理资源(例如更多的内存、更好的 cpu)。

 实现可伸缩性的技术

这里涉及到 devops,最好使用 aws fargate 之类的云服务。

https://aws.amazon.com/fargate/

下图中可以看到放大和缩小策略。

7安全性

它实际上是许多特点的集合:机密性 是指系统保护用户数据安全的能力;完整性 是保护外部资源免遭篡改的能力;身份验证 允许用户访问系统;授权 则告诉用户可以访问系统的哪些部分。授权通常使用 RBAC、ACL 或 ABAC 来实现。不可否认性 保证了消息的发送者不能否认自己发送了消息,并且接收者也不能否认自己接收了消息。

 增强安全性的技术

首先我们需要检测。

针对攻击行为,我们需要制定灵活的应对策略。大多数情况下我们可以撤消访问权限,在某些极端情况下我们可以关闭系统,当然最好还是避免后一种情况出现。最好使用成熟的安全解决方案,自行实现往往不是好办法。

8互操作性

它表示系统与外部系统通信的能力。合约接口是互操作性中最重要的概念,其涵盖了通信的所有方面,包括错误处理。

 改善互操作性的技术

最好的策略是使用企业集成模式。如果用到多个通信协议,这种策略就是最佳方法。

https://learning.oreilly.com/library/view/enterprise-integration-patterns/0321200683/

9可调整性

也称为 可变性 ,其描述了系统变化的难易程度。一般来说它是一个隐含的特征。作为架构师,你要知道系统变化的概率是未知的,但一旦出现变化,系统应该能够优雅地应对。变化是软件世界中唯一确定的事物。话虽如此,我们不能将整个系统都设计为可变组件。如果每个组件都是即插即用组件,设计就做不完了。因此我们需要找到那些变化概率很高的部分。

 改进可调整性的技术

有两个维度。作为一名架构师,你需要确定哪些部分具有较高的变化概率;作为软件工程师,你必须确保这些部分容易改动。遵循 SOLID 原则是一个很好的开始。可以使用适应度函数度量传入和传出耦合。我们需要计算变化成本。比如要构建一个 UI 表单,它需要的位置比我们最初想像的要多,则我们可以复制粘贴代码并进行必要的调整,也可以构建一个新组件并插进来。然后我们得到了变化的成本:

N x 编写代码的成本(复制粘贴)<= 编写组件 +(N x 将其插进来的成本)

还需要考虑时间,观察较长的时间才能得到可靠的观察结果。

10可部署性

所有系统都应封装在某种工件中,可以是 war、jar、ear、apk、dll、gem 等。它们被部署在能够运行它们的环境中。由于 docker 的进化,现在我们可以在一台机器上拥有多个环境。可部署性是一种将代码转换为客户可用产品的机制。

 改善可部署性的技术

最有效的是实施持续集成 / 持续部署(CI/CD)。认真的话,每次代码推送都将触发一个生产部署。为此,应通过适应度函数和自动化测试来保护你的代码。它是抗脆弱性的关键部分。我们希望能按需部署,一键完成工作。我们也会部署硬件。使用基础架构即代码之类的技术可以提高效率。

11可测试性

在所有系统中它都是一个重要特征。我们必须确保构建的系统尊重了客户的需求。复杂的系统很难测试。以微服务架构为例,我们有很多独立开发的活动部件。这个特征经常会让步给其他特征。为了使系统可测试,我们需要能控制每个组件的输入和输出。

 改善可测试性的技术

请尽量控制系统的复杂性。我们应该构建较小的组件,不要重新发明轮子;还应该编写可测试的代码,在适当的位置应用 TDD。

12简单性

这条特征是很难实现的。一切都是权衡取舍,而大多数情况下这一条都会被牺牲掉。但如果我们需要在有限的时间内快速构建某些东西,那么就应该优先考虑简单性。在构建 MVP(最小可行产品)时,我们关心的只有简单性。但请注意,实现目标之后,我们不应丢掉所有东西。不要与 PoC(概念验证)或某种 R&D 混淆。可重用性 在这里也很重要。

 改善简单性的技术

可以构建粗粒度的组件;使用 RAD 框架,例如 ApacheIsis、Vaadin 或 JHipster;牺牲简单性之前请确保自己能承受对应的代价;遵循 KISS 原则。记住时间是关键:先跑起来,再考虑美观和性能。

13可移植性

指的是系统从一个操作系统移植到另一个的能力,它会影响编程语言的选择。例如,我们知道为了运行 Java 代码需要一个 JVM,因此问题就是“JVM 是否可移植?”答案是肯定的。另一个例子是 golang:它打包为二进制文件,不需要外部依赖项,因此是可移植的。一些微软专属技术就不行,它们只能运行在微软操作系统中。

 改善可移植性的技术

一个显而易见的选项就是容器化、docker。一个 docker 引擎能够运行多个隐藏了实现细节的 docker 容器。

14易用性

谈到易用性时通常会提到 可配置性 ,即用户自定义系统的能力,比如通过 UI 主题更改外观和配置系统行为(例如控制用户访问权限等)。还有 本地化,也称为 i18n(internationalization)。它指的是系统支持多种标准的能力,一般是通过用户体验(UX)实现的。这里的标准指的是语言、货币、公制单位、字符编码等。本地化资源通常是静态的。

可访问性 是另一个易用性特征。世界上有些人是残疾的(失明、听力受损、色盲),我们如何确保这些人可以受益于我们的系统呢?对于色盲来说,选择颜色会花很多时间。Siri/Alexa 是盲人的好帮手。考虑可访问性时,请想到我们的祖父母是不是能方便地使用我们的系统。

另外还有 可支持性 ,比如说帮助页面或者 24x7 技术支持。我们应该努力让系统直观易用,这会影响可学习性,也就是用户习惯系统所需的时间。用户培训和帮助页面之类的策略很好用。

15可扩展性

它是描述系统对即插即用组件需求程度的特征。对于使用内核架构的系统来说,这是很重要的特征。Eclipse Platform 和 OSGI 标准就是经典的例子。

16抗脆弱性

它是系统应对压力、冲击、波动、噪声、错误、故障或攻击的能力。

改善抗脆弱性的技术

首先我们要敲打敲打系统。可以使用 CI/CD,它们本来就是做这种事的。每次代码更改都必须投入生产。当然,我们也要有防御机制,适应度函数就是个好方法;Simian Army 也是个不错的工具。

https://github.com/Netflix/SimianArmy

17可升级性

它是指系统无缝升级自身的能力。对于非 Web 产品(例如 App Store 和 Google Play),这很容易实现,因为它们的升级能力是嵌入到 OS 中的;涉及到 Web 应用时,事情就麻烦多了。

 改善可升级性的技术

首先我们需要为服务提供版本控制。下一步是使用蓝绿部署或金丝雀部署等策略进行零停机的时间部署。

18合规性

不管我们需要的是哪种第三方工具和框架,都应该得到它们的合法授权。我们需要重视开源软件的合规性因素,因为它们可能会附带一些我们不想要的额外约束。没有人愿意暴露自己的源代码,因此我们应该远离 GPL 许可证。在欧盟,《GDPR》已成为强制规定,因此我们需要确保系统符合其规定。还要考虑一些 ISO 标准,公司可能需要遵循某些流程才能符合它们的要求。

改善合规性的技术

理想情况下,每家公司都应该有一个法律部门,但现实并非如此。适应度函数(例如许可证检查)可以保护我们免受列入黑名单的许可证的影响。在设计系统时,我们必须找到一种保护用户数据隐私的方法。

19成本

可能是最重要的架构特点。一切都有成本,虚拟的、还是现实的都一样。任何成本都可以换算成金钱。如果我们需要购买某些工具(IDE)、云服务(例如 AWS)、第三方框架(例如 new-relic)的许可证,则总会产生财务成本。开发团队也要发工资,学习新技术或培训团队成员需要花钱。不尊重敏捷宣言是有代价的;错误的代码要付出代价;缺少单元测试会有代价;缺少 CI/CD 会有代价;没有基础架构即代码也会有代价……这个列表是没有尽头的。

 降低成本的技术

帮助客户控制成本是我们的责任。我们需要区分单纯的成本和投资,并让客户相信投资是划算的。

以 Scrum 流程为例,我个人认为它没什么用。在一个固定的周期(通常为两周)中,我们有这么多的仪式(计划、站会、演示、回顾),然后根据(猜出来的)估计值做计算,结果 Sprint 完成度 100%只是偶然而非必然。我们需要敏捷和适应,而不是盲目地遵循流程。我们应该减少会议和仪式,这样成本就会下降。我们应该专注于完成工作的本质要素。

测试是必要的投资,快速前进的唯一方法就是正确前进。我们必须说服客户,从长远来看,成本是会下降的。测试会减少错误的数量,从而减少成本。

代码质量是另一项投资。好的代码将带来更好的测试,提高稳健性、可维护性、可调整性等。与难以维护的系统相比,我们的更改花费的时间会更少,成本会下降。

20可存档性

指系统保留历史数据记录的能力。在数据是一等公民的系统中(例如财务系统),这个特征非常重要。数据绝不会删除,而只会归档,这主要是考虑到法律要求。可归档性是对可审计性的支持。

 实现可归档性的技术

首先是在数据上使用时间戳(例如 updatedOn、createdOn)。然后要有一个 cron 作业,将所有低于特定阈值的数据移入历史表中。另一种技术是将数据标记为软删除,但这会影响查询性能。

21可审核性 / 可跟踪性

这是支持重构历史的系统特征。我们必须记录所有关键操作(尤其是在安全场景中),以便重现问题并从错误中学习经验。我们也可以将这些记录用作法律依据。

 实现可审核性的技术

记录每个关键操作并集中存放这些记录。可以使用 ELK,或 sleuth-zipkin 具。

来源:https://sergiuoltean.com/2020/06/26/architecture-characteristics/  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
推荐,资料太大存放在网盘中,需要可下载观看。含教材。 第一部分 考试简介 1.1 考试大纲要求 1.2 考试科目介绍 第二部分 信息系统基础 2.1 信息系统工程总体规划 2.2 政府信息化与电子政务 2.3 企业信息化与电子商务 2.4 信息资源管理 2.5 信息化的标准、法律和规定 第三部分 系统开始基础 3.1 系统规划 3.2 软件开发方法 3.3 需求工程 3.4 软件系统建模 3.5 系统设计 3.6 测试与评审 3.7 软件开发环境与工具 3.8 系统运行与评价 第四部分 操作系统 4.1进程管理 4.2存储管理 4.3文件管理 4.4作业管理 4.5设备管理 第五部分 数据库系统 5.1数据库模式 5.2数据库完整性约束 5.3并发控制 5.4数据库设计 5.4.1数据库设计阶段 5.4.2ER模型 5.5数据库安全 5.6备份与恢复技术 5.7分布式数据库 5.8数据仓库 5.9数据挖掘 第六部分 计算机网络 6.1开放系统互连参考模型 6.2 TCP/IP协议族 6.3网络规划与设计 6.4计算机网络分类 6.5网络接入技术 6.6网络存储技术 6.7虚拟局域网(VLAN) 第七部分 软件架构设计 7.1 软件架构的概念 7.2 软件架构风格 7.3 面向服务的架构 7.4 特定领域软件架构 7.5 基于架构的软件开发方法 7.6 软件架构评估 7.7 软件产品线 第八部分 基于构件的开发 8.1 中间件技术 8.1.1 中间件的概念 8.1.2 主要的中间件 8.2 典型应用架构 8.3 企业应用集成 第九部分 应用数学 9.1 概率统计应用 9.2 图论应用 9.3 组合分析 9.4 算法的选择与应用 9.5 运筹方法 9.6 数学建模 第十部分 系统安全性与保密性设计 10.1安全与保密基础技术 10.2网络安全 10.3安全体系结构 10.3.1OSI安全模型 10.3.2MIS+S、S-MIS、S2-MIS 10.4安全审计 10.5安全策略 10.5.1核心 - 七定 10.5.2安全策略设计原则 第十一部分 系统配置与性能评价 11.1系统故障模型 11.2系统配置方法 11.3可靠性分析与可靠度计算 11.4性能评价方法 11.5软件容错 第十二部分 知识产权与标准化 12.1知识产权 12.1.1保护期限 12.1.2知识产权人确定 12.1.3侵权判断 12.1.4标准的分类 12.2标准化 12.2.1标准的分类 12.2.2标准类型的识别 第十三部分 多媒体基础知识 13.1多媒体技术基本概念 13.1.1音频相关概念 13.1.2图像相关概念 13.1.3媒体的种类 13.2多媒体相关计算问题 13.2.1图像容量计算 13.2.2音频容量计算 13.2.3视频容量计算 13.3常见多媒体标准 13.4数据压缩技术 13.4.1数据压缩基础 13.4.2有损压缩与无损压缩 第十四部分 嵌入式系统 14.1 嵌入式系统的特点 14.2 嵌入式系统的基本架构 14.3 嵌入式系统网络 14.4 嵌入式系统数据库 14.5 实时任务调度和多任务设计 14.5.1 调度算法分类 14.5.2 单调执行速率调度法 14.5.3 时间轮转调度 14.5.4 最早截止时间优先调度算法 14.5.5 优先级反转 14.6 中断处理和异常处理 14.7 嵌入式系统开发设计 14.7.1 交叉开发环境 14.7.2 开发过程 14.7.3 调试方法 第十五部分 开发管理 15.1 范围管理 15.2 时间管理 15.3 成本管理 15.4 文档管理 15.4.1 软件文档管理指南 15.4.2 计算机软件文档编制规范 15.5 软件配置管理 15.6 软件质量管理 15.6.1 质量管理的概念 15.6.2 质量模型 15.6.3 质量管理过程 15.6.4 质量保证与质量控制 15.7 风险管理 15.8 软件过程改进 15.8.1 CMM 15.8.2 CMMI 15.8.3 ISO/IEC 15504 15.8.4 SJ/T 11234-2001 第十六部分 系统架构设计案例分析 16.1 考点分析 16.2 如何解答试题 16.3 试题解答实例 16.3.1 质量属性与软件架构策略 16.3.2 数据流图与流程图 16.3.3 嵌入式系统设计 16.3.4 软件架构风格的选择 16.3.4 信息系统安全设计 第十七部分 系统架构设计论文 17.1 考点分析 17.2 做好准备工作 17.3 论文写作格式 17.4 如何解答试题 17.5 如何写好摘要 17.6 如何写好正文 17.7 常见问题及解决办法 17.8 论文评分标
资深专家倾情之作,揭秘软件系统架构设计真谛 内容包罗万象 叙述言简意赅 分析全面透彻 层次清晰合理 软件架构的好坏直接决定了软件系统的成败,而软件架构设计最关键的就是要解决软件主体模块之间的逻辑关系。尽管新技术、新工具不断涌现,技术本身千变万化,但一些基本的设计原理、设计思想却万变不离其宗。本书作者把软件架构知识、软件工程方法论、软件技术开发平台等相关知识有机地组织起来,清晰地地阐明了它们的关系,拨开软件架构设计的迷雾,为读者指出了一条学习软件系统架构知识的佳径。本书对软件架构工程技术和管理人员极具参考价值,同时也非常适合计算机及相关专业高年级本科生和研究生阅读。 本书特点: 层次清晰,结构合理。从抽象到具体分三个层次介绍相关知识,第一层次为体系结构及其相关概念,第二层次为流行的体系结构(模型)及其构件(协议),第三层次为具体的中间件技术以及基于上述技术的系统开发方法。 内容丰富,详略得当。从软件工程流程、软件工具模型、软件开发最佳实践到软件架构、框架、组件、对象、切面以及软件开发模式,再到开发语言、开发平台以及跨平台中间件,以软件架构为主线串联相关知识。 分析透彻,技术全面。从不同的角度观察不同的知识点,并利用短小精练的演示程序辅助解释关键技术。另外,本书附赠光盘,其中包含了经精心调试和编译的演示程序的完整源代码。 第2章 软件开发平台与软件系统架构 58 2.1 软件系统开发语言 58 2.2 C++与Java的对比综述 60 2.3 C++与Java的开发工具与开发过程 67 2.3.1 C++的基本开发工具与开发过程 67 2.3.2 Visual C++的开发平台与开发过程 70 2.3.3 Java的基本开发工具与开发过程 72 2.3.4 Java的三个开发平台 74 2.3.5 Java集成开发工具 92 2.4 Java SE的架构相关技术 92 2.4.1 Java的反射技术 93 2.4.2 Java的对象序列化技术 98 2.4.3 Java的异常处理技术 101 2.4.4 Java线程的并发控制 104 2.4.5 Java的集合类 105 2.5 Visual C++的架构相关技术 107 2.5.1 Windows API的窗口技术与消息处理技术 107 2.5.2 MFC的架构相关技术 112 2.5.3 Visual C++的动态链接库 132 2.6 Visual Studio与.NET框架 136 2.6.1 CLR及其相关概念 136 2.6.2 关于C# 137 2.6.3 桌面应用框架 137 2.6.4 扩展的B-S架构 141 2.7 Android平台 149 2.7.1 Android操作系统 149 2.7.2 Dalvik虚拟机 150 2.7.3 Android应用软件框架及其Activity构件 150 2.7.4 Android应用开发例子 152

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值