架构技能(四):需求分析

需求分析,即分析需求,分析软件用户需要解决的问题。

需求分析的下一环节是软件的整体架构设计,需求是输入,架构是输出,需求决定了架构。

决定架构的是软件的所有需求吗?肯定不是,真正决定架构设计的是关键需求或用户要解决的关键问题,其余非关键性的需求或非关键性的问题,可以用来验证软件架构设计的合理性。

需求分析,是在谈什么?谈识别关键需求。

如何识别关键需求呢?

关键需求具有决定性的意义和价值,根据笔者所参与研发过软件,总结为:关键需求往往是基础需求、核心需求和高风险需求。

  • 基础需求:基础需求体现在软件上是基础功能,往往具有 “稳定” 和 “原子化” 特征;基础功能很稳定,很少受到需求变动的影响;而且,基础功能往往不会再拆分;基于基础功能,软件往往会衍生出更多的扩展功能;在电商系统中,像 “商品”、“订单”、“支付” 等属于软件的基础功能,以此为基础进行扩展的 “营销”、“评论”、“客服” 则属于软件的扩展功能。

  • 核心需求:核心需求很容易理解,往往是软件必须要提供的能力,失去了核心需求,软件则没有意义;比如,移动手机系统的电话功能、智能汽车的驾驶功能、微信软件的聊天功能等等;识别关键需求,往往从识别用户必须要解决的关键问题入手来确认核心需求。

  • 高风险需求:高风险需求往往会影响软件研发的成败,必须在软件架构设计时充分考虑其高风险性,提出解决方案,降低或消除其风险;高风险需求更多体现在非功能需求方面,比如:在电商系统中用户搜索任何一类商品必须在 0.5 秒内看到结果,在水利监测系统中任意1~3台服务器宕机都不会影响水情警报的告警。

所以,架构师在接触到纷繁复杂的一堆需求时,切忌眉毛胡子一把抓地逐一分析,而应该将精力放在识别关键需求上面。

关键需求 = 基础需求 || 核心需求 || 高风险需求。

普适需求分析模型

这里,以 IM 系统为例,总结一个普适性的需求分析模型,见下图。

首先对所有需求点进行筛选,区分出 “功能需求” 和 “非功能需求”;然后对 “功能需求” 进行分析,识别出 “基础功能需求” 和 “扩展功能需求”,这样则将一团需求点从同一视角出发,拆分成了同类要素,整体化繁为简。

  • 基础功能需求:基础功能需求是整个系统的核心,往往体现关键需求中的 “基础需求” 和 “核心需求”; IM 系统的基础功能需求包括三部分: “用户”、“联系人” 和 “消息”,“用户” 描述的是当前登录者, “联系人” 描述的是当前登录用户的好友,“消息” 是 IM 系统最最核心的功能,包括 “私信消息”、“系统消息”、“云消息” 和 “离线消息”。

  • 扩展功能需求:是对基础功能需求的扩展,扩展功能需求的典型特征就是 “变动” 和 “扩展”,需求最不稳定;在实现扩展功能需求时往往基于基础功能进行。IM 系统的基础功能需求决定了 整个 IM 的业务框架,IM 系统的扩展功能需求,如: “群消息”、“多媒体消息”、“子母号”、 “红包” 等都是基于 IM的 “基础功能需求” 实现的;据说,微信的 “摇一摇” 功能,是由三个实习生用了不到一周时间就上线的功能。

  • 非功能需求:非功能需求更多体现的是关键需求中的 “高风险需求”;软件的非功能需求很多,我们对其进行归类和抽象,总结为高扩展需求、高吞吐需求和稳定性需求。

    • 高扩展—高扩展包括功能的高扩展和容量的高扩展; 功能的高扩展是指基于现有功能和代码,通过简单改造就可以轻松实现新的功能,这要求系统的基础功能的实现做到合适粒度的 “高内聚” 和 “低耦合”(在《架构技能(三):扩展性》一文中有详细分析); 容量的高扩展是指可以轻松地对集群进行线性横向扩容,以处理更高流量规模的访问请求。

    • 高吞吐—是互联网系统一直孜孜不倦的所追求的目标,如何提高系统的吞吐量呢?需要从两个方面着手,一是提高系统的并发量,一是提高系统的处理性能;也就是 “高吞吐” 依赖 “高并发” 和 “高性能”,这里需要注意,严格地说,在系统资源未耗尽之前提高并发量可以在一定程度上提高吞吐量;高吞吐、高并发、高性能是系统在同一维度三个不同视角的描述,一体三面,相互关联。

    • 稳定性—稳定性包括两个方面,分别是可用性和可靠性; 可用性是指系统持续工作的能力,比如系统可以 7 * 24 连续工作; 可靠性是指系统对于正确的输入一定会有正确的输出。可用性通常依赖于系统的整体架构设计,而可靠性通常更多的依赖于合理地程序编写。

直播答题案例

需求分析时,需要识别关键需求,对关键需求进行重点剖析,从而由关键需求导出系统的架构设计。下面以百万直播答题系统为例,演示整个过程。

百万直播答题系统需求描述如下:

直播答题是在视频直播的基础上增加了答题的玩法,每场12道题,每次下发一道题,答题时间10s,作答时间结束几秒后下发答案和统计数据,全部答对者平分奖金,答错或者超时未作答不可继续答题。

对上述文字描述进行分析,画出直播答题系统的客户端与服务端之间的交互流程,时序图如下:

综合文字描述和时序图,可以确定系统模块边界,业务范围框图如下:

明确了直播答题系统的业务流程、模块边界、功能需求和非功能需求后,可以进一步分析出其关键需求。

  • 百万用户同时在线答题,集中在10秒内提交答案,对系统的并发访问和造成的瞬时负载是非常高的,这是首当其冲最不能忽视的一点,所以 “高并发访问” 作为非功能需求,体现了关键需求的高风险需求类型;

  • 直播答题是在视频直播的基础上增加的答题的玩法,视频直播是整个系统的基座,体现了关键需求的基础需求类型;

  • 直播答题系统解决的是多个用户在线集中答题的问题,用户答题是系统必不可少的功能,体现了关键需求的核心需求类型;另外,“平分奖金” 的诱惑肯定会吸引 “黑客用户” 的蜂拥而至,因此 “防用户作弊” 也是系统的关键需求。

根据上述分析,百万直播答题系统的关键需求包括:

  • 高并发访问

  • 视频直播

  • 用户答题

  • 防用户作弊

在充分考虑上述四项关键需求后,可以推导出系统的架构设计,见下图。

如何根据关键需求,推导出系统的架构设计?系统的架构是如何实现上述关键需求的?以及怎样用非关键需求验证架构设计的合理性?在后续的文章中逐步进行分析。

最后,总结文中关键:

  1. 真正决定架构设计的是关键需求,非关键性需求用来验证软件架构设计的合理性;

  2. 关键需求往往是基础需求、核心需求和高风险需求;

  3. 普适性的需求分析模型中,将需求划分为功能需求和非功能需求,功能需求可划分为基础功能需求和扩展功能需求;

  4. 百万直播答题案例中,关键需求包括:高并发访问、视频直播、用户答题、防用户作弊。

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

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

相关文章

Linux:线程池和单例模式

一、普通线程池 1.1 线程池概念 线程池:一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价&…

Leetcode598:区间加法 II

题目描述&#xff1a; 给你一个 m x n 的矩阵 M 和一个操作数组 op 。矩阵初始化时所有的单元格都为 0 。ops[i] [ai, bi] 意味着当所有的 0 < x < ai 和 0 < y < bi 时&#xff0c; M[x][y] 应该加 1。 在 执行完所有操作后 &#xff0c;计算并返回 矩阵中最大…

C++泛型编程指南04-(对默认调用参数的类型推断)

文章目录 问题描述解决方案示例代码 关键点解释进一步改进&#xff1a;结合概念约束 你提到的情况确实是一个常见的问题&#xff1a;在C中&#xff0c;类型推断不适用于默认调用参数。这意味着如果你希望函数模板能够通过默认参数来实例化&#xff0c;你需要为模板参数提供一个…

在 Ubuntu 上安装 Node.js 23.x

在 Ubuntu 上安装 Node.js 23.x 前提条件安装步骤1. 下载设置脚本2. 运行设置脚本3. 安装 Node.js4. 验证安装 参考链接总结 在现代 web 开发中&#xff0c;Node.js 是一个不可或缺的工具。它提供了一个强大的 JavaScript 运行时环境&#xff0c;使得开发人员可以在服务器端使用…

maven mysql jdk nvm node npm 环境安装

安装JDK 1.8 11 环境 maven环境安装 打开网站 下载 下载zip格式 解压 自己创建一个maven库 以后在idea 使用maven时候重新设置一下 这三个地方分别设置 这时候maven才算设置好 nvm 管理 npm nodejs nvm下载 安装 Releases coreybutler/nvm-windows GitHub 一键安装且若有…

【B站保姆级视频教程:Jetson配置YOLOv11环境(六)PyTorchTorchvision安装】

Jetson配置YOLOv11环境&#xff08;6&#xff09;PyTorch&Torchvision安装 文章目录 1. 安装PyTorch1.1安装依赖项1.2 下载torch wheel 安装包1.3 安装 2. 安装torchvisiion2.1 安装依赖2.2 编译安装torchvision2.2.1 Torchvisiion版本选择2.2.2 下载torchvisiion到Downloa…

数科OFD证照生成原理剖析与平替方案实现

数科OFD证照生成原理剖析及C#平替方案实现 1. OFD证照生成原理 OFD&#xff08;Open Fixed-layout Document&#xff09;是一种基于XML的固定版式文档格式&#xff0c;广泛应用于电子发票、电子证照等领域。数科OFD证照生成工具的核心原理包括以下几个方面&#xff1a; OFD文…

【算法-位运算】位运算遍历 LogTick 算法

文章目录 1. 引入2. LogTick 优化遍历过程3. 题目3.1 LeetCode3097 或值至少为 K 的最短子数组 II3.2 LeetCode2411 按位或最大的最小子数组长度3.3 LeetCode3209 子数组按位与值为 K 的数目3.4 LeetCode3171 找到按位或最接近 K 的子数组3.5 LeetCode1521 找到最接近目标值的函…

NLP深度学习 DAY5:Sequence-to-sequence 模型详解

Seq2Seq&#xff08;Sequence-to-Sequence&#xff09;模型是一种用于处理输入和输出均为序列任务的深度学习模型。它最初被设计用于机器翻译&#xff0c;但后来广泛应用于其他任务&#xff0c;如文本摘要、对话系统、语音识别、问答系统等。 核心思想 Seq2Seq 模型的目标是将…

处理 **5万字(约7.5万-10万token,中文1字≈1.5-2token)** 的上下文

处理 5万字&#xff08;约7.5万-10万token&#xff0c;中文1字≈1.5-2token&#xff09; 的上下文&#xff0c;对模型的长文本处理能力和显存要求较高。以下是不同规模模型的适用性分析及推荐&#xff1a; 一、模型规模与上下文能力的关系 模型类型参数量最大上下文长度&#…

吴恩达深度学习——优化神经网络

本文来自https://www.bilibili.com/video/BV1FT4y1E74V&#xff0c;仅为本人学习所用。 文章目录 优化样本大小mini-batch 优化梯度下降法动量梯度下降法指数加权平均概念偏差纠正 动量梯度下降法 RMSpropAdam优化算法 优化学习率局部最优问题&#xff08;了解&#xff09; 优…

Shell篇-字符串处理

目录 1.变量引用 2.获取字符串长度 3.字符串截取 4.删除子字符串 5.字符串替换 总结&#xff1a; Bash&#xff08;Shell 脚本&#xff09;中的字符串处理语法。以下是对其的介绍和总结&#xff1a;Bash 变量可以使用不同的语法来获取、修改和删除字符串的内容。图片中列…

面经——C语言——指针大小,内存分配,野指针,大小端

文章目录 指针大小分段C语言内存分配1. 静态内存分配1.1 栈内存分配1.2 数据段内存分配 2. 动态内存分配2.1 malloc&#xff08;Memory Allocation&#xff09;2.2 free&#xff08;Free Memory&#xff09; 动态内存分配的流程例子 野指针野指针的原因&#xff1a;防止野指针的…

CMake项目编译与开源项目目录结构

Cmake 使用简单方便&#xff0c;可以跨平台构建项目编译环境&#xff0c;尤其比直接写makefile简单&#xff0c;可以通过简单的Cmake生成负责的Makefile文件。 如果没有使用cmake进行编译&#xff0c;需要如下命令&#xff1a;&#xff08;以muduo库echo服务器为例&#xff09;…

书生大模型实战营7

文章目录 L1——基础岛提示词工程实践什么是Prompt(提示词)什么是提示工程提示设计框架CRISPECO-STAR LangGPT结构化提示词LangGPT结构编写技巧构建全局思维链保持上下文语义一致性有机结合其他 Prompt 技巧 常用的提示词模块 浦语提示词工程实践(LangGPT版)自动化生成LangGPT提…

Shadow DOM举例

这东西具有隔离效果&#xff0c;对于一些插件需要append一些div倒是不错的选择 <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"utf-8"> <title>演示例子</title> </head> <body> <style&g…

SQLAlchemy 2.0的简单使用教程

SQLAlchemy 2.0相比1.x进行了很大的更新&#xff0c;目前网上的教程不多&#xff0c;以下以链接mysql为例介绍一下基本的使用方法 环境及依赖 Python:3.8 mysql:8.3 Flask:3.0.3 SQLAlchemy:2.0.37 PyMySQL:1.1.1使用步骤 1、创建引擎&#xff0c;链接到mysql engine crea…

《LLM大语言模型+RAG实战+Langchain+ChatGLM-4+Transformer》

文章目录 Langchain的定义Langchain的组成三个核心组件实现整个核心组成部分 为什么要使用LangchainLangchain的底层原理Langchain实战操作LangSmithLangChain调用LLM安装openAI库-国内镜像源代码运行结果小结 使用Langchain的提示模板部署Langchain程序安装langserve代码请求格…

某网盘工具,限速下载上传!

聊一聊 某度盘对于个人和未开通会员的情况下&#xff0c;容量还是有点小。最近自己的盘满了&#xff0c;还有很多东西放不进去。转眼发现正在下载的寻雷&#xff0c;就点进去看看寻雷盘有多大&#xff0c;一看&#xff0c;还好&#xff0c;比某度盘容量大。 但一想&#xff0…

62.病毒在封闭空间中的传播时间|Marscode AI刷题

1.题目 问题描述 在一个封闭的房间里摆满了座位&#xff0c;每个座位东西向和南北向都有固定 1 米的间隔。座位上坐满了人&#xff0c;坐着的人可能带了口罩&#xff0c;也可能没有带口罩。我们已经知道房间里的某个人已经感染了病毒&#xff0c;病毒的传播速度是每秒钟感染距…