系统架构主题之八:非功能性需求对系统架构及设计的影响

从大的方面来讲,软件系统的需求分为功能性需求和非功能性需求。功能性需求一般由业务分解而来,是直接面向用户的需求,也是直接体现用户价值的需求。非功能性需求一般多是由功能性需求的内在要求衍生而来,其价值更多的体现在对功能性需求的支撑上。通常,也将这两者称为软件系统的功能属性和质量属性。

虽然功能属性很重要,但是架构设计中,研究更多的是非功能属性,也就是质量属性。因为这些属性决定着架构是否满足要求从而可支撑用户的需求;是否足够健壮从而可长期运行;是否足够灵活从而可应对未来的变化等等。要做到这一点,就需要对质量属性进行提取,以便针对性的做出决策。下面我们从理论上先看看常见的质量属性有哪些。

1 非功能性需求的相关概念

软件开发中,很多东西都比较难以量化,特别是开发周期问题。因为软件开发是一个相对主观,且跟程序员水平关系比较大的工作,这就导致了人月神话的故事。但是,质量属性却是系统的一个相对可测量或者可测试的属性,可用来描述系统满足利益相关者需求的程度。

首先是性能。性能是指系统的响应能力,即经过多长时间对某个事件做出响应,或者在某段时间内能够处理的事件个数。通常用单位时间内执行事件任务个数来定量表示。

其次是可靠性。可靠性用来表示提供无故障连续服务的能力,表示系统在故障、错误等情况下维持系统功能特性的能力。通常用MTTF和MTBS来衡量。

再者,可用性,也就是正常运行时间比例,通常用两次故障之间的时间长度来衡量。

还有安全性,是系统抵御外部攻击,防止非授权用户访问的能力。包括身份认证、机密性、完整性、不可否认性、可控性等

可修改性,指系统能够以较高性价比进行变更的能力,包括可维护性,可移植性,可扩展性及结构重组。

功能性,是系统完成期望的工作的能力。

可变形,是指架构经过扩充或变更而成为新架构的能力。跟可修改性不同的是,这里是成为新架构。

互操作性,与其他系统或组件交互的能力。

其他还有文化与政治需求,全球化,本地化,多语言等要求。

2 实际系统中如何保障上述非功能性需求

现代软件系统经历了多种模型的演化,每一次的改进都体现了关注点分离,内聚与耦合的强化处理。无论是分层的架构,抽象的手法,还是分而治之的设计等。这些方法的运用,导致软件开发的方法也发生了相应的变化。早期,程序是一个从零到一的产物,这个过程程序员是它的上帝,对它的一切都进行管理。后来,出现操作系统,部分通用需求就沉淀到操作系统中,这样,程序员不再操心程序的加载、调度问题,而只需要关注功能的实现。再之后,随着软件功能的复杂化,在应用软件内部也产生了一些革新的方法论,包括从单体到分层,从分层到服务化,从服务化到微服务,甚至到现在的更大的统一和抽象:云计算。云计算引入了云操作系统,在其上产生了云原生应用,无服务器应用,函数即服务(FaaS)等等。

站在更高的角度来看这一切的演变,我们会发现,底层的基座一直在加固、加厚,为的就是上层应用开发的便捷。就好比一句hello world的打印,在上层来看非常简单,但是底层要做的工作一样都少不了。冰山在膨胀,只是这些变化大部分都在水面之下,很多开发者感知不到而已。

在今天,各种框架和库的推出速度不减反增,不是因为我们的功能需求增加了,而是更多的非功能需求可以更好更快的实现了。得益于底层基座的不断完善和强化,在已有工作的基础上产生更加强大的基座,是这些库和框架发芽生根的原始动力,现有的成果也提供了更加丰富的土壤,因而加速了这一过程。有时候我们会发现,某一个功能框架的应用,需要依赖数十个其他功能框架,就是这一特征典型的表现。

高可靠、高并发、高可用、高安全、高吞吐、高性能、高扩展等等特性,在以前都是需要程序员自己手把手的搭建和解决的,现在可能只需做一个选择题,考虑重点是用哪一家的框架和库,变成这类问题了。从而,实现关注点或者重心始终聚焦于业务和功能实现上,聚焦于价值最大化上。

举个简单例子,今天搭建一个个人服务器,比十年前不知道简单多少倍。之前需要一个团队干的事情,今天可能一个简单培训后的初级程序员就可以做了,而且还不需要太多时间,这就是生产工具促进生产力在程序开发世界的体现。

说这些,并不是鼓励大家不用关注软件的质量属性,相反,要想成为合格的架构师,不想成为眼高手低的纸上谈兵者,还是需要对系统的基本原理有深刻的理解。想象一下,如何成为基础底座的开发者,你就知道自己需要掌握什么了。为了对质量属性有更好的理解,下面仍然结合前述某电力系统项目,谈谈在保证软件架构质量属性方面所采取的应对策略。

性能方面:这一方面的要求对企业架构的方案选型、设计有直接的影响。首先,需要了解业务的特点,其对性能的需求,深刻把握这一点,才能在基础技术选型上开好头起好步。我们以上述某电力系统为例来说明这一点。通常信息系统类的业务功能,对系统没有特殊要求。比如,CPU满足一定性能,内存足够可能就可以了。点击一个按钮,至于是0.1秒响应还是0.2秒响应,在用户的感官上是没有太大区别的,因为这超过了人类感知的分辨率。但是,像前述某电力系统项目,其中有两个业务特点,就对系统提出了特殊的要求:一个是业务中包含了强实时性要求的采集业务,一个是业务中包含了有一定实时性要求的音视频业务。这两类业务又对硬件和软件提出了相应的要求。像实时数据的采集,这是实时性要求最高的一类业务,这类业务在硬件层面的高要求需要FPGA类硬件可编程芯片支撑才可以实现。特别是并行化要求比较严格的一些算法处理,关联数据的采集必须并行进行。采集的数据一部分本地运算处理,一部分远传。在本地运算处理端,需要实时操作系统,在远传端,需要光纤配合特殊的协议,从而保证在故障发生时,能够在极短的时间内处理,避免故障传导蔓延到更大的范围,造成不可避免的经济损失。这些需求,对硬件的选择,操作系统的选择,业务功能开发方式都提出了不同的要求。另外,音视频业务虽然没有实时数据采集这样高的实时性要求,使用Linux系统就可以满足,但是编解码过程仍然会消耗大量的CPU算力。为此,配备硬件编解码器都是业界常用的方案。综合上述需求,我们在设备端采用了多CPU加FPGA的架构方案。数据采集使用带ARM内核的FPGA芯片ZYNQ实现,音视频编解码采用NVR产品类常见的带多通道硬件编解码CPU实现。这样,关键业务需求在技术层面就得到了保证,避免开发进入后期出现性能瓶颈,影响项目的开展。当然,理论选择通过了,还需要做一个验证方案,对选型进行压力测试,保证可选即可行。

上面主要提到了硬件层面的应对方案。其实,软件方面的选择也很重要,且跟硬件相比,软件对开发周期和成本的影响更大。系统是否成熟,开发人员是否熟悉该系统,是否有成熟靠谱的框架都是至关重要的信息。好在整个项目不是从零开发,之前已经有了一套经过产品化验证的视频转发框架,可以满足多视频流业务对性能的要求。在数据采集方面,开发平台内置提供了经过验证的freeRTOS实时操作系统,且提供了SDK开发环境,这些都简化了功能开发的流程,使得开发人员可以将精力集中到业务功能上,且进一步的保证了可靠性。所以,无论是选用业界成熟的框架还是自己设计解决,非功能属性都是为业务的稳定开展服务的。

关于可靠性就更不用说了,是系统架构设计过程中重点关注的内容,往往也是用户比较关注的内容。关于这一点,前面已经有所提及。总的来讲,上述系统为了保障音视频业务的流畅性,设计了支持多网络、异构网络捆绑传输的网络库。通过该方法,多个通道的冗余特性被充分发挥了出来,提高了网络带宽,增加了网络的可靠性。其他方面,像终端设备的软硬件看门狗设计、常见的磁盘阵列、负载均衡、关键节点的备份设计等这些比较常用的手段,也是需要在架构阶段考虑到并纳入整体方案的。不过在这个过程中需要注意一点,过犹不及。不可因为某些特性的支持,导致整个架构过于复杂,出现反噬效应,反而导致不可靠。比较好的经验是平衡架构复杂性和其他功能特性,在保证基础功能特性满足的前提下,尽可能构建较为简洁且易理解的架构,在整个系统运转起来后,可进一步查漏补缺。如果需要对架构的某些方面进行修改,也不会存在大的问题。这些动作可纳入架构演化历程中,通过重构手段来完成。不要幻想架构设计好后是一成不变的。把握这一点,反而能够在开发过程中积累经验,增强信心,减少未知,最终做到从容应对。

安全性方面,在上述系统中也是非常关键的一个要素。因为是涉及电力系统的项目,安全性要求是比较高的。部分功能需要在内部网络运行,有相应的加密标准要求。系统方面,也是需要部署到Linux系统中,这方面因为前期产品是在Windows系统上开发的,还需要考虑跨平台的迁移。好在之前设计时就考虑了可移植性的问题,大部分代码都是可复用的。除此,系统中存在移动设备,这些节点需要通过无线网络接入电力系统内部,也就是需要穿透公网。为实现该需求,在系统设计时选择VPN加密通道的方法,采用专门的加密卡,在公网上构建安全私密的内部专用网络通道,保证数据的安全可靠,减少了接入风险。

除了这些项目关联的安全需求外,常见的身份认证、分级分组的权限管理、安全审计等措施也在系统设计中进行了对应的实施。

其他像可用性,可修改性,在前面的论述中也都有了相应的提及。像可修改性,系统采用了构件化的设计方式,前述的网络库就是以构件方式提供,编解码的业务口也是抽象设计为通用的接口,虽然底层的硬件接口不完全一样,但是在构件层面上,保证了接口的一致性,减少了对接成本,提高了开发效率。

通过上述措施的采用,整个系统的设计实现,基本满足了用户对相关质量属性的要求。上述有针对性的分析和设计,并采取必要的应对措施,有力的保证了整个项目的稳步推进。可以预见,如果没有对这些质量属性进行充分的挖掘和分析,系统的架构很可能成为空中花园,华而不实,且迟早会坍塌下来。

但是即便如此,系统投运后也出现了一些预料外的问题,主要是卫星会商业务的可用性。这一业务最初设想是融合电话和短信,通过短信构建控制通路,通过电话构建数据通路,以此搭建便捷实用的不受空间地点限制的正真意义上的应急会商。考虑到短信存在容易丢和超时的现实情况,为了便于业务层的开发(不用过于关注这些通道特性),在设计控制通路时采用了分层策略,底层包装出一个通道,业务层直接使用。但是实际测试中发现,使用移动网络可行的短信通道,在卫星网络下变得几乎不可用。为了构建一个可靠通道所引入的重传机制却成为占用带宽资源、影响正常传输的障碍。可见,理论上看似完美的方案,实际中可能举步维艰。后来还是放弃通道的设计概念,直接在短信上构建业务功能,在业务中根据需求、优先级特性等有差别的处理短信丢失和超时问题,才慢慢改进了业务体验。这是后续在架构设计方面需要汲取的经验教训。

以上就非功能需求对系统架构设计的影响进行了一些整理总结,希望对大家有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/124412.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode.275 H 指数 II

题目链接 Leetcode.275 H 指数 II mid 题目描述 给你一个整数数组 c i t a t i o n s citations citations ,其中 c i t a t i o n s [ i ] citations[i] citations[i] 表示研究者的第 i i i 篇论文被引用的次数, c i t a t i o n s citations citat…

c# 操作word中的表格 批量复制和批量插入

用的是windows自带的dll包,没有引用第三方 1 WordHelper.cs using System; using Microsoft.Office.Interop.Word; using System.Runtime.InteropServices;namespace cadWord {public class WordHelper{private Microsoft.Office.Interop.Word.Document wDoc null…

C# “依赖注入” 中的 “三种生命周期”

🚀简介 依赖注入(Dependency Injection,简称DI)是一种实现控制反转(IoC)的技术,用于减少代码之间的耦合度。通过依赖注入,一个类可以从外部获取其依赖的对象,而不是自己…

如何理解AutoGPT

AutoGPT和GPT-4都是OpenAI公司的产品。AutoGPT是一个实验性开源应用程序,展示了GPT-4语言模型的能力。GPT-4是OpenAI研发的人工智能语言模型。 AutoGPT在GitHub主页上有151k星(151k星代表了151,000个用户点赞了该项目),AutoGPT获…

Hudi系列文章7-RFC24 Flink 写入流程优化

文章目录 前言问题背景瓶颈与解决方案瓶颈一解决方法工作流程:精准一次语义容灾CoorinatorCheckpoint如何配合使用StreamWriteOperatorCoordinator CheckpointedFunctionStreamWriteFunctionInstant 提前生成问题 瓶颈二问题解决方案BucketAssignerBucketWriter 重点…

Kubernetes概述及其组件/核心组件

目录 1、K8S 是什么? 2、为什么要用 K8S? 3、k8s的特性 4、Kubernetes 集群架构与组件 5、核心组件 Master 组件 ●Kube-apiserver ●Kube-controller-manager ●Kube-scheduler 配置存储中心 ●etcd Node 组件 ●Kubelet ●Kube-Proxy ●docker 或…

Java自学者怎么写简历?

Java自学者怎么写简历? 首先,有技术实力的人绝对不会问这个问题。虽然你是自学的,但是一定要有项目!没有项目都是空谈。最近很多小伙伴找我,说想要一些Java资料,然后我根据自己从业十年经验,熬夜…

中间件安全-CVE 复现K8sDockerJettyWebsphere漏洞复现

目录 服务攻防-中间件安全&CVE 复现&K8s&Docker&Jetty&Websphere中间件-K8s中间件-Jetty漏洞复现CVE-2021-28164-路径信息泄露漏洞CVE-2021-28169双重解码信息泄露漏洞CVE-2021-34429路径信息泄露漏洞 中间件-Docker漏洞复现守护程序 API 未经授权访问漏洞…

Python beautifulsoup模块简介及安装

视频版教程:一天掌握python爬虫【基础篇】 涵盖 requests、beautifulsoup、selenium 简单来说,Beautiful Soup 是 python 的一个库,最主要的功能是从网页抓取数据。官方解释如下: Beautiful Soup 提供一些简单的、python 式的函…

个人服务器怎么搭建?个人服务器搭建方法

​  个人服务器是指一台由个人拥有和管理的服务器,用于存储和提供个人网站、应用程序或其他在线服务。搭建个人服务器可以让我们更好地掌控自己的数据和网络资源。下面介绍一种常见的个人服务器搭建方法。 第一步:选择合适的硬件 我们需要选择一台适合…

uniapp表单验证

以下是一个简单的uniapp表单验证示例&#xff1a; <template><view class"uni-form"><view class"uni-form-item"><view class"uni-form-label">用户名</view><input type"text" v-model"user…

逻辑回归

逻辑回归 二分类情况 对于二分类问题&#xff0c;在线性可分的情况下&#xff0c;试图构建一个判别式 W ′ X ′ b {WXb} W′X′b&#xff0c;为了便于操作将判别式增广为 W X {WX} WX。 W x i { > 0 , x i ∈ w 1 , Y 1 < 0 , x i ∈ w 2 , Y 0 {Wx_i}\begin{cas…

PyTorch入门学习(六):神经网络的基本骨架使用

目录 一、引言 二、创建神经网络骨架 三、执行前向传播 一、引言 神经网络是深度学习的基础。在PyTorch中&#xff0c;可以使用nn.Module类创建自定义神经网络模型。本文将演示如何创建一个简单的神经网络骨架并执行前向传播操作。 二、创建神经网络骨架 首先&#xff0c…

Spring Boot 优雅配置yml配置文件定义集合、数组和Map

一、value 获取配置文件 在平时的yml配置文件中&#xff0c;我们经常使用到配置基本数据类型的字符串&#xff0c;比如配置日志文件的写法如下&#xff1a; # 配置日志输出级别 logging:# 指定logback配置文件的位置 config: classpath:logback-spring.xml# 文件日志要输出的路…

SpringBoot可以连接RabbitMQ集群吗 ?

目录 一、SpringBoot可以连接RabbitMQ集群吗&#xff1f;二、springboot连接到rabbitmq集群可以负载均衡吗&#xff1f;三、SpringBoot既然可以配置负载均衡&#xff0c;为什么还需要Haproxy做负载均衡&#xff1f; 一、SpringBoot可以连接RabbitMQ集群吗&#xff1f; Spring …

Java14-16新特性

目录 一、Java14新特性 1、instanceof模式匹配 2、友好的空指针(NullPointerException)提示 3、record类型 二、Java15新特性 1、Sealed Classes 2、CharSequence新增方法 3、TreeMap新增方法 4、文本块 5、无需配置环境变量 三、Java16新特性 1、包装类构造方法的…

Sketch mac 98.3(矢量绘图设计软件)

Sketch是一款专为Mac设计的矢量图形编辑软件&#xff0c;被广泛应用于UI/UX设计、网页设计、移动应用设计等领域。Sketch提供了各种工具和功能&#xff0c;包括绘图、图形设计、排版等&#xff0c;可以帮助设计师轻松地创建高质量的矢量图形和模型。Sketch的主要特点包括&#…

Git基础命令实践

文章目录 简介git的安装配置git的安装git的配置 git使用的基本流程创建版本库时光机穿梭版本回退工作区和暂存区管理修改撤销修改删除文件 远程仓库添加远程库从远程库克隆 总结 简介 本文主要记录了我在学习git操作的过程&#xff0c;以及如何使用GitHub。建议先参考廖雪峰的…

测试环境内存溢出排查过程

基本信息 客户名称&#xff1a;xxx 产品名称&#xff1a; 版本号&#xff1a; 问题分类&#xff1a;编码问题 环境类型&#xff1a;实体机 问题现象 保险公司测试环境爆内存&#xff0c;机器挂掉。总共64g的内存&#xff0c;在没有开始测试tomcat部署war包前内存使用率为25%左…

debian和ubuntu

Debian和Ubuntu是两种流行的Linux发行版&#xff0c;它们之间有密切的关系&#xff0c;但也存在一些重要的区别。 关系&#xff1a; Ubuntu是基于Debian创建的。这意味着Ubuntu使用与Debian相同的APT包管理系统&#xff0c;并共享来自Debian库中的大量包和库。 区别&#xf…