第9章 · 播客 第4集

软件架构设计 · 六属性战术全家桶:可用性到易用性

🎙️ 本集播客第4集:战术清单第一弹——可用性的错误检测、错误恢复、错误预防三类十二个战术逐一拆解(心跳、表决、主动被动冗余、检查点/回滚等),加上可修改性的局部化修改、防止连锁反应、推迟绑定时间三类,术语名一个不能错。 语音由微软 Edge 神经网络语音预生成(女声·晓伊,男声·云希)。点击下方任意对话可直接从该句开始播,当前句朗读时下一句已预先加载,无缝衔接。
🎙️ 第9章播客 第4集
⬇ 下载本集 点击播放
阿明
师姐,开始报战术清单吧,我先做好笔记。
小雅
先可用性。可用性战术的目标是阻止错误发展成故障,至少能够把错误的影响限制在一定范围内,从而使修复成为可能。战术分为三类:错误检测、错误恢复、错误预防。先说错误检测,三个战术。命令/响应:一个构件发出一个命令,并希望在预定义的时间内收到一个来自审查构件的响应,例如远程错误的检测。
小雅
心跳(计时器):一个构件定期发出一个心跳消息,另一个构件收听到消息,如果未收到心跳消息,则假定构件失败,并通知错误纠正构件。异常:当出现异常时,异常处理程序开发执行——原文这里就是「异常处理程序开发执行」这个表述,触发异常处理流程的意思。
阿明
练习题第十二题就是问心跳属于哪类战术,答案是错误检测。它为什么不是错误恢复?
小雅
判据看动作性质:心跳只负责「发现不对劲」——发出定期消息、收不到就报告构件失败,它本身不修复、不切换、不接管。恢复类战术的特征是出事之后的补救动作,比如切换到备用构件、回滚到检查点。检测管发现、恢复管补救、预防管未雨绸缪,三类按时间轴排:事前预防、事发检测、事后恢复。选择题给「资源仲裁」当干扰项,那是性能战术的分类,跟可用性无关,直接排。
阿明
事前预防、事发检测、事后恢复,这个时间轴记法好。
小雅
接着错误恢复,六个战术,是本节最大的一组。表决:通过冗余构件或处理器与表决器连接,构件按相同的输入及算法计算输出值交给表决器,由表决器按表决算法如多数规则确定是否有构件出错,表决通常用在控制系统中。
小雅
主动冗余(热重启、热备份):所有的冗余构件都以并行的方式对事件做出响应,它们都处在相同的状态,但仅使用一个构件的响应,丢弃其余构件的响应,错误发生时通过切换的方式使用另一个构件的响应。被动冗余(暖重启/双冗余/三冗余):一个构件即主构件对事件做出响应,并通知其他构件即备用的必须进行的状态更新,也就是同步,当错误发生时,备用构件从最新同步点接替主构件的工作。
阿明
主动冗余是大家一起算只用一份,被动冗余是主力干活备胎同步,出错时从最新同步点接替。这两个的括号别名也要记吧?
小雅
要,热重启、热备份配主动冗余;暖重启、双冗余、三冗余配被动冗余——原文写的是「暧重启」,这是「暖」字的排版用字,音频里你记成暖重启即可,考试选项用的是暖。
小雅
恢复类还有三个。备件:备件是计算平台配置用于更换各种不同的故障构件。状态再同步:主动和被动冗余战术要求所恢复的构件在重新提供服务前更新其状态,更新方法取决于可以承受的停机时间、更新的规模及更新的内容多少。检查点/回滚:检查点就是使状态一致的同步点,它或者是定期进行,或者是对具体事件做出响应,当在两检查点之间发生故障时,则以这个一致状态的检查点(有快照)和之后发生的事务日志来恢复系统,数据库中常使用。
阿明
检查点/回滚配快照加事务日志,数据库常用——这细节像选项。
小雅
最后错误预防,三个。从服务中删除:如删除进程再重新启动,以防止内存泄露导致故障的发生。事务:使用事务来保证数据的一致性,即几个相关密切的步骤,要么全成功,要么都不成功。进程监视器:通过监视进程来处理进程的错误。
阿明
可用性三类十二个:检测是命令/响应、心跳、异常;恢复是表决、主动冗余、被动冗余、备件、状态再同步、检查点/回滚;预防是从服务中删除、事务、进程监视器。
小雅
齐了。转可修改性。可修改性战术包括三类:局部化修改、防止连锁反应、推迟绑定时间。局部化修改,是在设计期间为模块分配责任,以便把预期的变更限制在一定的范围内,从而降低修改的成本。它的子战术有:维持语义的一致性——语义的一致性指模块中责任之间的关系,使这些责任能够协同工作,不需要过多地依赖其他模块,耦合和内聚指标反映一致性,应该根据一组预期的变更来度量语义一致性;使用「抽象通用服务」,如应用框架的使用和其他中间软件的使用,是它的子战术。
小雅
局部化修改还有三个子战术:预期期望的变更,通过对变更的预估进行预设、准备,使变更的影响最小;泛化该模块,使一个模块更通用、更广泛的功能;限制可能的选择,如在更换某一模块如处理器时,限制为相同家族的成员。
小雅
第二类防止连锁反应。由于模块之间有各种依赖性,因此修改会产生连锁反应,防它的战术有四个:信息隐藏,就是把某个实体的责任分解为更小的部分,并选择哪些信息成为公有的、哪些成为私有的,通过接口获得公有责任;维持现有的接口,尽可能维持现有接口的稳定性,例如通过添加接口、通过新的接口提供新的服务可以达到这一目的;限制通信路径,限制与一个给定的模块共享数据的模块,减少由于数据产生或使用引入的连锁反应;仲裁者的使用,在具有依赖关系的两个模块之间插入一个仲裁者,以管理与该依赖相关的活动,仲裁者有很多种类型,例如桥、调停者、代理等,就是可以提供把服务的语法从一种形式转换为另一种形式的仲裁者。
阿明
仲裁者的例子是桥、调停者、代理——这仨名字像选项池。第三类推迟绑定时间呢?
小雅
推迟绑定时间的背景先记:系统具备在运行时进行绑定并允许非开发人员进行修改,也就是配置。四个战术:运行时注册,支持即插即用;配置文件,在启动时设置参数;多态,在方法调用的后期绑定;构件更换,允许载入时绑定。
阿明
运行时注册、配置文件、多态、构件更换——绑定时机从运行时、启动时到载入时各不相同。
小雅
对,这四个的共性是「推迟」,把定死的决策推到越晚越好。本集必背:可用性目标三句话——阻止错误发展成故障、限制影响范围、使修复成为可能;检测是命令/响应、心跳、异常,心跳只发现不修复;恢复是表决、主动冗余即热重启热备份、被动冗余即暖重启双冗余三冗余、备件、状态再同步、检查点/回滚;预防是从服务中删除、事务、进程监视器;可修改性三类——局部化修改含维持语义一致性、抽象通用服务、预期期望的变更、泛化该模块、限制可能的选择;防止连锁反应含信息隐藏、维持现有的接口、限制通信路径、仲裁者的使用即桥调停者代理;推迟绑定时间含运行时注册、配置文件、多态、构件更换。
阿明
这集密度是全书顶级的,我得回头再听两遍。下一集讲什么?
小雅
下一集把剩下三个属性的战术收掉:性能的资源需求、资源管理、资源仲裁,安全性的抵抗攻击、检测攻击、从攻击中恢复,可测试性和易用性的那几组。讲完 9.2 节就通关,再往后就是架构风格的大板块。
阿明
师姐,剩下的属性战术,接着上一集的节奏来吧。
小雅
先性能。性能与时间相关,影响事件响应时间有两个基本因素,这个要先记:资源消耗——事件到达后进入一系列的处理程序,每一步处理都要占用资源,而且在处理过程中消息在各构件之间转换,这些转换也需要占用资源;闭锁时间——指对事件处理时碰到了资源争用、资源不可用或对其他计算的依赖等情况,就产生了等待时间。
阿明
资源消耗和闭锁时间,闭锁时间就是「等着」的部分。
小雅
对。性能战术有三类。第一类资源需求:减少处理事件流所需的资源——提高计算效率如改进算法、减少计算开销如在可修改性与性能之间权衡,减少不必要的代理构件;减少所处理事件的数量——管理事件率、控制采样频率;控制资源的使用——限制执行时间如减少迭代次数、限制队列大小。
小雅
第二类资源管理:引入并发,引入并发对负载平衡很重要;维持数据或计算的多个副本,C/S 结构中客户机 C 就是计算的副本,它能减少服务器计算的压力,高速缓存可以存放数据副本,在不同速度的存储库之间的缓冲;增加可用资源,在成本允许时尽量使用速度更快的处理器、内存和网络。
小雅
第三类资源仲裁,它是通过调度策略实现的,策略名单一个不能错:先进先出 FIFO;固定优先级调度,先给事件分配特定的优先级,再按优先级高低顺序分配资源;动态优先级调度,包括轮转调度、时限时间最早优先;静态调度,可以离线确定调度。
阿明
调度策略四个名字:先进先出、固定优先级、动态优先级(轮转调度、时限时间最早优先)、静态调度。轮转调度归在动态优先级名下,这个从属关系要记。
小雅
对,选项爱把轮转调度说成固定优先级的例子,错。接着安全性,战术包括三类:抵抗攻击、检测攻击和从攻击中恢复。抵抗攻击有六条:对用户进行身份验证,包括动态密码、一次性密码、数字证书及生物识别等;对用户进行授权,即对用户的访问进行控制管理;维护数据的机密性,一般通过对数据和通信链路进行加密来实现;维护完整性,对数据添加校验或哈希值;限制暴露的信息;限制访问,如用防火墙、DMZ 策略。
阿明
机密性靠加密、完整性靠校验或哈希——这对搭配是常考辨析。
小雅
是。检测攻击:一般通过「入侵检测」系统进行过滤、比较通信模式与历史基线等方法。从攻击中恢复两条:恢复,与可用性中的战术相同;识别攻击者,作为审计追踪,用于预防性或惩罚性目的。
小雅
再看可测试性,战术包括输入/输出和内部监控。输入/输出三条:记录/回放,指捕获跨接口的信息,并将其作为测试专用软件的输入;将接口与实现分离,允许使用实现的替代即模拟器来支持各种测试目的;优化访问线路/接口,用测试工具来捕获或赋予构件的变量值。内部监控:当监视器处于激活状态时记录事件,如通过接口的信息。
小雅
最后易用性,三类。运行时战术三个模型:任务的模型,维护任务的信息,使系统了解用户试图做什么,并提供各种协助;用户的模型,维护用户的信息,例如使系统以用户可以阅读页面的速度滚动页面;系统的模型,维护系统的信息,它确定了期望的系统行为,并向用户提供反馈。设计时战术:将用户接口与应用的其余部分分离开来,预计用户接口会频繁发生变化,因此单独维护用户接口代码将实现变更局部化,这与可修改性相关。支持用户主动操作:支持用户的主动操作,如支持「取消」「撤销」「聚合」和「显示多个视图」。
阿明
易用性的三个模型——任务的、用户的、系统的,名字很像,怎么分?
小雅
看系统「维护的是谁的信息」:任务模型维护用户想干什么,用户模型维护用户是谁、什么习惯,系统模型维护系统自己的期望行为。取消、撤销、聚合、显示多个视图这四个词归「支持用户主动操作」,选项若把它们塞进运行时战术,错。
小雅
现在把六个属性战术的总表串一遍,这是 9.2 节的终极必背。可用性:错误检测、错误恢复、错误预防;可修改性:局部化修改、防止连锁反应、推迟绑定时间;性能:资源需求、资源管理、资源仲裁;安全性:抵抗攻击、检测攻击、从攻击中恢复;可测试性:输入/输出、内部监控;易用性:运行时战术、设计时战术、支持用户主动操作。
阿明
我再加几处易混点的自查:心跳属错误检测不属恢复;轮转调度、时限时间最早优先是动态优先级调度;机密性用加密、完整性用校验或哈希;安全性的恢复战术与可用性战术相同;可测试性的记录/回放是捕获跨接口的信息。
小雅
全对。到这里 9.2 节质量属性通关。本集必背最后压一遍:性能两因素是资源消耗和闭锁时间,三类战术是资源需求、资源管理、资源仲裁,调度策略有先进先出、固定优先级、动态优先级即轮转调度和时限时间最早优先、静态调度;安全性三类是抵抗攻击、检测攻击、从攻击中恢复;可测试性两类是输入/输出和内部监控;易用性三类是运行时战术即任务、用户、系统三个模型、设计时战术、支持用户主动操作。
阿明
9.2 节背完,感觉半章的弹药已经上膛。下一集去哪?
小雅
下一集进入 9.3 架构风格板块,先讲风格的总纲——Garlan 和 Shaw 的五大类分类:数据流风格、调用/返回风格、独立构件风格、虚拟机风格、仓库风格,每类的子风格名单一个不能错,练习题第四题「管道-过滤器风格属于哪类」就考这个分类表。然后细拆数据流风格的批处理序列和管道-过滤器。