案例一 软件架构
关于人工智能系统的需求分析,给出十几个需求。
a.系统发生业务故障时,3秒内启动 XXX,属于可靠性
b.系统中的数据进行导出,要求在3秒内完成,属于可用性
c.质量属性描述,XXX,属于____
d.质量属性描述,XXX,属于可用性
e.质量属性描述,XXX,属于____
f.系统需要增加新的模块,需要3天完成,属于____
g.系统分为三个不同的国家语言,完成XXXX功能,属于____
h.系统使用了云服务器,要求1分钟以内检测错误和故障,并且1个小时以内恢复
i.系统使用XX检测云服务器故障,需要在2秒切换
【问答题】
1.从质量属性的角度分析填空。(14分)
字母 | 属性 |
a | 功能性 |
b | 可靠性 |
c | (1) |
d | (2) |
e | (3) |
f | - |
g | - |
h | 可用性 |
2.针对质量属性可以使用ping/echo和心跳模式实现,分别简述ping/echo和心跳模式的实现原理,张工认为从资源利用率的角度来看采取心跳模式策略比较合适,简述为什么。(11分)
答案:
实现原理:
ping/echo:通过 ICMP 协议发送一个“Echo Request”消息到目标主机,等待其回复“Echo Reply”。这是一种网络层的连通性测试方法。echo:更广泛地指任何类型的请求-响应模式,用于验证远程服务或组件是否可达和正常工作。这可以是基于HTTP、TCP等协议的简单请求。
心跳模式:客户端定期向服务器发送心跳信号(如HTTP请求),服务器接收到后立即回应。如果连续几次心跳未得到响应,则认为服务器可能出现故障。心跳信号通常包含少量数据,比如时间戳或简单的健康检查信息,以确保不仅网络连接正常,而且应用程序本身也在正确运行。
采取心跳模式的原因:
针对性强,减少不必要的通信开销;
按需调整频率和内容,优化资源使用,比较灵活;
结合健康检查,提高诊断精度;
支持复杂环境下的高效运作。
案例二 数据库Cache-aside架构
关于web架构的题目,主要是涉及到数据库和缓存。
(Cache-aside架构,也称为旁路缓存模式,是一种常见的缓存使用策略。
基本概念:在此架构中,缓存和数据库是两个独立的存储系统,它们之间没有直接的交互。应用程序代码负责管理缓存和数据库之间的数据一致性。
读操作流程:
①应用程序首先尝试从缓存中读取数据;
②如果数据存在于缓存中(缓存命中),则直接将缓存的数据返回给应用程序;
③如果数据不存在于缓存中(缓存未命中)则应用程序从数据库中检索数据,将数据写入缓存,并返回给用户。
写操作流程:
①应用程序更新数据库中的数据;
②应用程序可以选择删除缓存中的旧数据(缓存失效)或更新缓存中的数据;
③为了确保数据一致性,通常推荐在更新数据库后删除或更新缓存中的相关数据。)
【问答题】
1.填空流程图说明缓存读写的过程。(10分)
答:
(1)向缓存请求读取该商品信息
(2)若命中则返回该商品信息
(3)若未命中则访问数据库查询该商品信息
(4)将查询到的数据库数据更新到缓存
(5)将查询到的数据库目标数据返回
2.填空流程图说明写缓存的过程。(6分)
答:
(1)更新数据库中的目标商品信息。
(2)将数据库中更新的商品信息写入到缓存中,确保数据一致性。
3.王工使用了多线程技术进行缓存处理,线程1负责写入,线程2负责读取,可能存在数据一致性问题,请解释其原因,并给出3个以上的解决办法。(9分)
答案:原因:
竞态条件:如果没有适当的同步机制,两个或多个线程可能同时访问和修改共享资源,导致最终结果取决于线程调度顺序。例如,线程1正在更新缓存中的某个条目,但线程2在同一时间点读取该条目,它可能会读取到部分更新或旧版本的数据。
可见性问题:在多线程环境中,一个线程对共享变量所做的更改不一定立刻被其他线程看到。这是因为现代CPU架构通常会使用寄存器和缓存来加速性能,这可能导致某些更新在一段时间内只对本地线程可见。
原子性破坏:写入操作可能不是一个原子操作,意味着它可以被中断或分段执行。如果线程1在完成整个写入之前就被切换出去,而线程2此时尝试读取,那么它将得到一个不完整的或者错误的数据状态。
解决方法:延时双删、同步删除、加互斥锁(分布式锁)、消息队列、基于缓存更新策略。
案例三 嵌入式
机器人操作系统ROS。
【问题1】(13分)
(1)ROS定义和特点。
(2)ROS2与ROS1相比哪些地方做了改进?
答案:
(1)ROS(Robot Operating System)是一个用于编写机器人软件的框架。它提供了一系列的工具和库,帮助开发者创建复杂的、可以在多种操作系统上运行的机器人应用程序。
ROS的主要特点包括:
·分布式计算能力:ROS提供了一种方式让多个计算机或设备协同工作,通过网络进行通信 ·消息传递:ROS使用了一种进程间通信(IPC)机制,可以在不同的节点之间传递数据。
·包管理:ROS提供了一个包管理系统,允许用户分享和安装软件组件。
·工具和库:ROS提供了一系列工具和库,例如用于3D渲染的RViz,用于模拟机器人的Gazebo,以及用于路径规划的navigation stack等。
(2)ROS2与ROS1的对比,如下表所示:
ROS1 | ROS2 |
所有节点需Master节点管理 | 所有节点平行分布,基于DDS的Discover |
rosbuid、catkin管理项目 | ament、colcon管理项目 |
使用C++03和Python2 | 使用C++11和Python3 |
CMake构建系统 | 支持其他构件系统的选项 |
基于2009设计的API | 全新的用户API |
TCPROS/UDPROS通信机制 | DDS数据分发服务 |
Linux系统平台 | Linux/Windows/Mac/RTOS系统平台 |
【问题2】(8分)
3.四种通信服务,选词填空。
答案:1.话题通信:是一种单向通信模型,在通信双方中,发布方发布数据,订阅方订阅数据,数据流单向的由发布方传输到订阅方,。2.服务通信:是一种基于请求响应的通信模型,在通信双方中,客户端发送请求数据到服务端,服务端响应结果给客户端3.动作通信:是一种带有连续反馈的通信模型,在通信双方中,客户端发送请求数据到服务端,服务端响应结果给客户端,但是在服务端接收到请求到产生最终响应的过程中,会发送中间连续的反馈(进度)信息到客户端。4.参数服务:是一种基于共享的通信模型,在通信双方中,服务端可以设置数据,而客户端可以连接服务端并操作服务端数据。
【问题3】(7分)
根据下图,请解释ROS2架构每一层含义。
案例四 web系统
基于Elasticsearch分词的商品推荐系统(微信小程序接入)。
1. 基于Elasticsearch分词,解释下Standard, Simple, Whitespace, Keyword 几种分词器的分词原理。(6分)
答案:Standard:standard分词器通常用于处理多种语言的文本,它会识别并拆分单词、数字、电子邮件地址、网址等,并且能够处理一些标点符号。对于中文、日文、韩文等不使用空格的语言,Standard 分词器可能不是最佳选择,因为它不能很好地理解这些语言的语法规则。例如:“Hello, World!” 分词结果为[“Hello”, “,”, “World”, “!”]。
Simple:simple分词器非常基础,它只是简单地按照非字母字符进行分割,即将所有的非字母字符视为分隔符。因此,所有连续的字母序列都会被视为一个词汇单元,而任何非字母字符(如空格、标点符号、数字)都会被丢弃或用作分隔标志。例如:“Hello, World! How are you?”分词结果为[“Hello,”, “World!”, “How”, “are”, “you?”]
Whitespace:whitespace分词器仅仅根据空白字符(如空格、制表符、换行符)来分割文本,不会去除任何字符,也不会考虑标点符号。这意味着标点符号会被当作独立的词汇单元处理。例如:“Hello, World! How are you?”分词结果为[“Hello,”, " ", “World!”, " ", “How”, " ", “are”, " ", “you?”]
Keyword:keyword分词器并不真正执行分词操作。相反,它会将整个输入文本作为一个单独的词汇单元输出。这意味着输入文本中的所有内容都被认为是一个不可分割的整体。例如:“Hello, World!” 分词结果为 [“Hello, World!”]。
2. 系统架构图填空,从给出的选项中选出对应的选项填入对的位置,8个空。(12分)
分层:接入层、显示层、网络层、应用层、业务逻辑层、控制层、数据层。
技术:Mybatis、Nginx、Flink、Javascript、Node.js、RESTful、Elasticsearch、Kafka
答:
3. RESTful 架构有什么特点,是如何实现前后端分离的。(7分)
答案:
无状态性:每个请求从客户端到服务器都必须包含理解该请求所需的所有信息。服务器不会存储任何客户端的状态或会话数据,这使得前端和后端可以独立扩展,并且任意一个都可以在不影响另一个的情况下进行更新。
统一接口:Restful API 提供了一套标准的操作集(GET、POST、PUT、DELETE 等),这些操作与资源(通常是名词形式的数据实体,如用户、订单等)相关联。这种一致性简化了前端与后端之间的交互,使前端开发者可以更容易地理解和使用API。
资源导向:在 RESTful 设计中,所有的操作都是围绕着资源展开的。资源通过URL标识,并通过HTTP方法来表示对资源的不同操作。这种方式让前端能够以直观的方式与后端资源进行交互。
分层系统:RESTful 架构支持分层系统,这意味着客户端不必直接连接到最终的服务端;相反,它可以经过多个中间层(如负载均衡器、缓存代理等)。这增加了系统的灵活性和安全性,同时也便于前后端各自独立演化。
基于HTTP协议:RESTful 服务通常基于HTTP协议构建,利用HTTP的方法和状态码来传递语义信息。这使得任何能够发起HTTP请求的技术栈都可以作为前端与RESTful后端通信,从而促进了技术选型的多样性。
JSON 或 XML 数据格式:RESTful API 常常使用JSON或XML格式交换数据。这两种格式都是轻量级的、易于解析的文本格式,非常适合跨平台的数据传输。前端可以通过JavaScript轻松处理JSON对象,而后端可以用多种语言和技术生成和解析它们。
前后端分离部署:前端代码(HTML、CSS、JavaScript)可以托管在一个静态文件服务器上,甚至可以直接嵌入到单页应用(SPA)中,而不需要依赖于后端逻辑。后端则专注于提供业务逻辑和服务,两者之间仅通过API进行通信。
案例五 软件系统设计
医用血糖监测系统:题目大体是说有一个打胰岛素泵的系统,首先通过血糖仪测量的数据,然后自动计算出要使用的胰岛素剂量,再通过这个泵系统自动去打胰岛素给病人。
1.危险驱动的安全分析的4个步骤,并简要说明。(10分)
确定系统、识别危险、评估风险、确定风险控制措施、监控和复查。
2.胰岛素系统,填空题(9分)
好像有以下选项,但是不全,填空的地方有些直接用文字表达了①血糖传感器错误 ②传感系统异常 ③血糖计算不准 ④传感器错误 ⑤泵信号失效 ⑥错误时间推送预定的量 ⑦定时器失效 ⑧胰岛素计算错误。
答:
(1)②传感系统异常
(2)⑥错误时间推送预定的量
(3)⑤泵信号失效
(4)⑦定时器失效
(5)⑧胰岛素计算错误
(6)算法错误
(7)计算错误
(8)①血糖传感器错误
(9)③血糖计算不准
3.形式化开发和软件测试技术的特点。(6分)
答案:
形式化开发特点:
数学基础:形式化开发方法基于数学原理,使用形式化语言来描述系统需求和设计,使得开发过程更加严谨和精确。
严格性:形式化方法要求对系统行为的每一个细节都进行明确的定义,减少歧义性。
可验证性:由于使用了数学化的描述,形式化开发的结果可以进行逻辑上的证明,确保系统满足预定的规格说明。
抽象层次:形式化方法通常涉及不同层次的抽象,从高级的需求规范到低级的实现细节。
自动化支持:形式化方法可以更容易地与自动化工具结合,例如模型检查器和定理证明器。
高成本:形式化开发通常需要高度专业化的知识和技能,因此成本较高,且不适合所有项目。
软件测试技术特点:
验证和确认:软件测试旨在验证软件是否满足规定的需求,并确认软件是否按照预期工作。
多样性:测试技术多样,包括单元测试、集成测试、系统测试、验收测试等,每种测试针对不同层次的问题。
迭代过程:软件测试是一个迭代的过程,随着软件的开发和需求的变更,测试也需要不断进行和调整。
人为因素:测试很大程度上依赖于测试人员的经验、知识和创造力,因此具有一定的主观性。
成本效益:测试可以发现缺陷并指导修复,从而减少软件发布后的问题,具有较好的成本效益。
无法完全保证质量:由于测试的局限性,如测试用例的覆盖率问题,无法保证测试能够发现所有的缺陷。
测试工具:现代测试技术往往依赖于自动化测试工具,这些工具可以提高测试效率和准确性。
持续集成:在敏捷开发实践中,软件测试通常与持续集成相结合,确保代码的持续质量和稳定性。
总结:形式化开发强调的是开发过程的严谨性和可证明性,而软件测试技术则更侧重于通过实际的运行来发现和修正软件中的缺陷。两者可以互补,共同提高软件的质量。
软考高级系统架构设计师第二版VIP课程:
系统架构设计师第二版VIP课程https://edu.csdn.net/course/detail/40283