业务架构 序列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

相关文章

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 未启用

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

Spring、Spring Boot、Spring Cloud 的区别与联系分析

《Spring、SpringBoot、SpringCloud的区别与联系分析》Spring、SpringBoot和SpringCloud是Java开发中常用的框架,分别针对企业级应用开发、快速开... 目录1. Spring 框架2. Spring Boot3. Spring Cloud总结1. Sprin

Spring 中 BeanFactoryPostProcessor 的作用和示例源码分析

《Spring中BeanFactoryPostProcessor的作用和示例源码分析》Spring的BeanFactoryPostProcessor是容器初始化的扩展接口,允许在Bean实例化前... 目录一、概览1. 核心定位2. 核心功能详解3. 关键特性二、Spring 内置的 BeanFactory

MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析

《MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析》本文将详细讲解MyBatis-Plus中的lambdaUpdate用法,并提供丰富的案例来帮助读者更好地理解和应... 目录深入探索MyBATis-Plus中Service接口的lambdaUpdate用法及示例案例背景