
之前我们讨论过软件架构风格的五大经典分类,它们由 David Garlan 和 Mary Shaw 总结。然而,这些传统风格在处理动态变化的现实世界时,有时会显得“死板”——它们预设了处理策略,一条路走到黑,缺乏应对环境实时变化的能力。
但在许多基于物理环境的软件(如汽车ABS防抱死系统、智能空调)中,系统必须具备动态演化和自我调整的能力。因此,一种针对动态、实时环境而设计的新架构风格应运而生:闭环控制风格。
简单来说,这种风格的核心是设定一个目标,并持续保持它。当环境变化导致目标可能偏移时,系统能自动感知、分析并执行调整,重新恢复目标状态。就像一个能自己克服困难的“宝子”。
与它相对的,是 开环控制系统风格:固定流程,只管执行,不关心结果是否正确,也不保证目标是否达成。
一个最直观的对比例子就是 电视遥控器 和 空调温度控制器。
- 电视遥控器(开环控制):你按下“音量+”键,它发出红外信号。信号可能被遮挡,电视音量可能没变化,它也不会知道,更不会重试。
- 空调温度控制器(闭环控制):你设定目标温度26℃。它会持续制冷,直到温度传感器检测到室温达到26℃才停机。如果室温回升,它会再次启动制冷,始终努力维持26℃的目标。

我们可以这样理解:
- 开环结构:在执行决策的过程中,不收集外部反馈信息,也不根据情况改变决策。好比只会机械执行命令的同事,碰到困难就停下,结果对不对也不管。
- 闭环结构:在决策过程中,不断收集信息、反馈给决策者,并动态调整决策。好比有主动性的同事,会为了达成目标,自己收集信息并调整策略。
举个开发中的小例子:图片加载。
常规做法是设置 src 链接,至于图片是否能成功加载并渲染,前端并不关心。这就是典型的开环结构。
而我们可以进行优化,监听图片的 onerror 或 onload 事件。如果加载失败,则尝试重试或替换备用图。这就是应用了闭环结构的思想。
那么,闭环结构是如何根据变化调整策略的呢?主要分为两种控制机制:
两种核心控制机制
1. 反馈控制 FeedBack
逻辑:检测输出结果,发现目标已经偏离,再启动调整程序。属于“事后诸葛亮”,有错再改。
- 优点:策略简单,包容性强。不用关心偏离的具体原因,反正事后修复就好。
- 缺点:存在滞后性。错误或偏离已经发生才补救,在某些对实时性要求极高的场景中可能产生影响。
- 例子:前面提到的图片加载失败后重试,就是典型的反馈控制。
2. 前馈控制 FeedForward
逻辑:检测可能导致目标偏离的干扰因素,在干扰影响输出之前,就通过计算提前采取动作来抵消它。属于“防患于未然”。
- 优点:理论上可以实现零滞后,系统输出更平稳,避免被破坏。
- 缺点:实现难度高,极度依赖精准的预判模型。如果模型不准,提前采取的“纠正”动作反而可能成为新的干扰。
- 例子:根据流量上升趋势预测服务器负载,提前扩容,而不是等到CPU飙高再处理。
一个不太恰当但易懂的例子:
- 反馈控制:等抓到对象出轨了,再处理(离婚或原谅)。
- 前馈控制:观察到对象身边出现了新的帅哥/美女,就提前介入处理,防患于未然。
在实际应用中,为了兼顾响应速度和稳定性,通常会结合使用前馈与反馈控制:
- 用 前馈控制 快速抵消那些已知的、可测量的、冲击大的主要干扰。
- 用 反馈控制 在系统底层兜底,慢慢修正那些不可预测的、微小的残余误差。
例如在服务器自动扩容场景:
- 反馈控制:监控发现CPU利用率已达90%(偏离了预设的60%安全目标),触发规则,自动扩容两台新服务器。
- 前馈控制:系统监控流量增长曲线,预测在10分钟后负载将突破阈值,于是提前5分钟自动扩容多台服务器。
闭环控制风格的3C模型设计
作为一种架构风格,闭环控制风格也遵循组件、连接件、约束的3C模型。
组件
系统主要由三类核心元素构成:
- 监视器:负责持续检测环境数据或干扰因素,判断当前状态与目标的偏差。
- 控制器:接收监视器传来的数据,基于预设目标进行比较、计算和分析,动态制定下一步的调整策略。
- 执行器:接收控制器的指令,执行具体的调整动作,改变环境或系统状态。
连接件
定义了组件间的交互方式:
- 连续数据/控制流:组件间不再是单次调用,而是持续的、周期性的数据流动。监视器向控制器传递“环境数值流”,控制器向执行器传递“控制指令流”。
- 反馈回路:这是该风格最核心的连接件。在执行器和监视器之间建立一条反向通道,使执行结果能被实时收集并反馈给监视器,形成闭环。
约束
定义了系统必须遵守的规则:
- 闭环回路:系统必须在逻辑或物理上形成一个完整的圆环(环境->监视->控制->执行->环境),这是区别于开环的根本。
- 实时性:感知、决策、执行的全过程必须是周期性、连续或准连续地执行。
- 动态调整:系统必须具备根据环境反馈动态调整策略的能力,以保证目标的达成。
总而言之,闭环控制风格就是通过感知(监视器)、决策(控制器)、执行(执行器) 三大组件的协作,依托反馈回路和实时性约束,使软件系统能够动态适应现实世界的不确定性。

希望这篇关于闭环控制架构风格的解析,能帮助你理解如何在动态系统中设计自适应能力。如果你想深入探讨更多系统设计话题,欢迎来云栈社区交流。
|