业务架构 序列5 -- 以终为始(非功能性需求分析)

2023-10-30 20:20

本文主要是介绍业务架构 序列5 -- 以终为始(非功能性需求分析),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们知道软件有功能性需求和非功能需求之分。在很早以前,惠普公司的罗伯特·格雷迪(Robert Grady)及卡斯威尔(Caswell)就提出了FURPS需求模型(关于什么是FURPS模型,自己百度之)。

有兴趣朋友也可以进一步关注公众号“架构之道与术”, 获取原文。 或扫描如下二维码: 这里写图片描述

软件的非功能性需求其实有很多,不同类型的软件,其侧重点也会有差别。同时,随着分布式系统的发展,这方面的理论也在扩充。

本文想通过一些最通俗的表述,来说明我们常用的、关注最多的非功能性需求都有哪些。

并发性
c端的系统,大家首先关注的,就是系统能抗多大的量。说通俗点,可以多少人同时访问。常用的衡量指标就是TPS/QPS, 平均响应时间/最大响应时间,并发数。(关于高并发相关的技术设计,将会在另外一个序列:技术架构中详细讲述)

可用性
从服务角度来说,1个服务不可用,有2层意思:
(1)机器挂了,不能对外提供服务,直接抛错
(2)机器没挂,但是超时。这涉及到“性能”2字。

一致性
比如数据库的参照完整性、事务、缓存与DB数据同步、多备份数据一致性问题。。

大家熟知的CAP里面,C就是这里的一致性,A就是这里的可用性,还有1个P(指的网络出现分区。网络分区其实是不可避免的1个客观存在)。

稳定性/可靠性
稳定性,可靠性,这2个词的界限很模糊,此处也不想去深究这2个词到底有什么本质差别。只是想用直白的语言,说明一下这个词指代什么?

我理解的“稳定性”,指系统没有任何undefined的行为。啥叫undefined?

所有的if-else语句里面,没有不处理的分支;
所有的API调用,每种异常返回值都有处理;
有没有考虑内存、磁盘的上限;
系统不会时不时冒个bug出来;
出了case,有很好的日志监控,能快速修复。
系统的qps,不会有抖动(除非业务有变化,比如大促),是1条平滑的曲线;
发布新版本,回滚方案?
新系统上线,灰度平滑切换?
Monkey Test? 压力测试?
。。。
可以看出,“稳定性”或者“可靠性”,这个范围非常广,这个也就是我们常说的,“很能反映一个工程师的素养的地方”。

可维护性
跟可维护性密切相关的,是另外一个1个词:“可理解性”,或者说“代码可读性”。

系统架构设计简单,接口简洁,表数据合理?
旧的人离职,新人接手,是否要用很长时间才能搞清楚代码逻辑?

系统功能耦合,改1个地方,牵动全身?

系统某些模块,年久失修,没人能搞清内部逻辑?
。。。

可扩展性
来个新需求,堆1堆新功能,没办法在现有系统上灵活扩展?

很多地方写死的,没有办法灵活配置?

容易变化的逻辑,散落在各个系统里面,很多地方跟着一起改?

可重用性
开发新的需求,旧的功能模块,拿过来可以直接用?
还是要改很多地方,改了半天,发现还不如做个新的?

补充:
对于C端应用来讲,会很关注高并发/高可用,然后有的业务(比如支付),对一致性要求非常高;

对于B端业务,会更关注系统的可维护性、可扩展性、可重用性,有了这些特性,你的系统才能不拖业务后腿,可以快速的支撑各种各样的复杂业务需求的开发。

总结
本文讲这个,主要是想说明做架构的一种“以终为始”的思维方式。先明确落脚点,或者说最终要达到目的(也就是上面这些非功能性需求),再去想要达到这些目的,可以用什么样的技术手段。

相关链接:
《业务架构 – 序列4 – 圈定边界(利益相关者分析)》

这篇关于业务架构 序列5 -- 以终为始(非功能性需求分析)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/310347

相关文章

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

Java异常架构Exception(异常)详解

《Java异常架构Exception(异常)详解》:本文主要介绍Java异常架构Exception(异常),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. Exception 类的概述Exception的分类2. 受检异常(Checked Exception)

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用