Skip to content

离散控制 = 采样与数字控制器 ​

解决什么问题:连续系统的离散化实现—— 软件系统本质上是离散的(CPU 按指令周期执行),如何把控制律正确地离散化。

业务问题 ​

真实场景 ​

场景 1:定时任务的执行频率

业务规则:每 5 分钟更新一次缓存
实现:CRON 任务每 5 分钟执行一次

问题:
- 任务执行需要 30 秒
- 但下一个任务 4.5 分钟后就开始
- 多个任务并行执行
- 资源争抢

→ 离散化 = 采样 + 处理 + 等待 + 采样...

场景 2:限流器的窗口设计

需求:限制 QPS 不超过 1000

设计 A:固定窗口(每 1 秒重置计数器)
  问题:窗口切换瞬间可能 2 倍流量(2000 QPS)

设计 B:滑动窗口(每 100ms 滑动)
  问题:内存开销大

设计 C:令牌桶(按需补充)
  优点:平滑限流

→ 离散化 = 限流器的核心

场景 3:分布式系统的最终一致性

主库写入 → 同步到从库

实现 A:同步复制(强一致)
  - 每次写入都等待同步完成
  - 延迟高

实现 B:异步复制(最终一致)
  - 写入主库立即返回
  - 后台异步同步到从库
  - 延迟低但有数据窗口

→ 异步 = 离散采样 + 批量同步

失败的典型做法 ​

做法 1:采样频率过低

✗ 每 1 小时采集一次业务数据
✗ 用 1 小时前的数据做决策

后果:决策过时,反应慢

做法 2:采样频率过高

✗ 每 1ms 采集一次
✗ 大量资源用于采集

后果:资源浪费,系统变慢

做法 3:离散化丢失信息

✗ 把连续的状态变成离散的状态(如布尔化)
✗ "用户活跃度" → "活跃 / 不活跃"

后果:信息丢失,决策不准

控制论视角 ​

数学原型 ​

钱学森《工程控制论》Ch 10 §10 引言:

"随着数字计算机的普及,离散控制系统已经成为工程控制论的重要分支。离散系统的核心是:连续系统的离散化——把微分方程变成差分方程,把模拟信号变成采样信号。"

钱学森 §10:

"Z 变换是分析离散系统的有力工具——它把差分方程变成代数方程,把离散系统的稳定性判定变成'所有极点都在单位圆内'的判断。"

控制论解法 ​

连续 → 离散的转换:

连续:ẋ = A·x + B·u      ← 微分方程
              ↓ 采样(周期 T)
离散:x(k+1) = Φ·x(k) + Γ·u(k)  ← 差分方程

其中:
Φ = e^(AT)              ← 离散化状态转移
Γ = ∫₀ᵀ e^(Aτ)B dτ     ← 离散化控制矩阵

Z 变换:
X(z) = Z[x(k)]          ← 离散信号的频域表示
G(z) = Y(z)/U(z)        ← 离散传递函数

稳定性判据:所有极点都在单位圆内

与业务的对应 ​

控制论概念软件工程
连续系统现实世界(连续变化)
采样周期 T定时任务周期 / 轮询间隔
离散信号 x(k)软件状态(离散的)
Z 变换数据结构 / 算法分析
离散传递函数软件系统的"响应特性"
量化误差浮点精度损失 / 整数舍入
数字控制器软件实现的控制模块

核心概念 ​

定义 ​

离散控制:连续系统的离散化实现——通过采样将连续信号变成离散信号,通过数字控制器实现控制律。

软件工程对位:软件系统本质上是离散的(CPU 按指令周期执行),如何把控制律正确地离散化。

离散化的三个关键参数 ​

采样周期 T:
- 太短 → 资源浪费 / 数据冗余
- 太长 → 响应慢 / 信息丢失
- 经验值:根据业务响应要求 + 系统开销

量化精度:
- 太低 → 信息丢失
- 太高 → 资源浪费
- 经验值:根据业务精度需求

抗混叠滤波:
- 防止高频信号被误认为低频信号
- 软件:滑动窗口 / 中值滤波

软件工程的离散化场景 ​

场景离散化方式关键参数
定时任务周期执行任务周期
限流器滑动窗口窗口大小
健康检查周期探测探测周期
监控采集周期采样采样频率
数据库同步异步复制同步周期
缓存更新周期刷新TTL
A/B 实验周期评估评估窗口
告警评估周期评估评估间隔

关键属性 ​

属性含义
不可避免软件系统本质是离散的
可调采样周期可调整
有损离散化会丢失部分信息
可分析Z 变换等工具可分析离散系统
有边界采样周期不能太短(资源)或太长(响应)

离散化的"采样定理" ​

Nyquist 采样定理:

要无失真地恢复原始信号,
采样频率必须 ≥ 原始信号最高频率的 2 倍。

软件工程对位:
- 业务变化周期 = 原始信号频率
- 采样周期 = 业务变化的 1/2
- 例:业务每 1 分钟变化一次 → 采样周期 ≤ 30 秒

工程实践 ​

步骤 1:识别需要离散化的连续量 ​

问:
- 业务中有哪些"连续"的概念?
  - 用户活跃度(连续)
  - 系统负载(连续)
  - 业务量(连续)
- 这些连续量在系统中如何表示?
  - 离散值?布尔?分段?

输出:
- 连续量清单
- 当前离散化方式
- 是否合理

步骤 2:定义采样周期 ​

采样周期 = 业务响应要求 / 系统开销

例 1:业务监控
- 业务响应要求:5 分钟内发现问题
- 系统开销:每次采集 1ms
- 采样周期 = 1 分钟(5 分钟响应要求 / 5 倍冗余)

例 2:限流
- 业务响应要求:1 秒内拒绝过多请求
- 系统开销:每次检查 0.1ms
- 采样周期 = 100ms(1 秒 / 10 倍冗余)

例 3:数据库同步
- 业务响应要求:5 秒内同步
- 系统开销:同步耗时 500ms
- 采样周期 = 1 秒(5 秒 / 5 倍冗余)

步骤 3:设计离散化算法 ​

算法 1:直接采样
- 简单 / 直观
- 例:每 1 分钟采样一次用户活跃度
- 适合:变化平缓的量

算法 2:滑动平均
- 平滑噪声
- 例:过去 5 分钟的平均延迟
- 适合:有噪声的量

算法 3:指数加权
- 近期权重高
- 例:EWMA 算法
- 适合:趋势分析

算法 4:中值滤波
- 抗异常值
- 例:过去 10 次采样的中位数
- 适合:有突发异常的量

步骤 4:处理量化误差 ​

量化误差 = 真实值 - 离散值

例:
- 真实活跃度:73.6%
- 离散化:74%(保留整数)
- 量化误差:0.4%

处理:
- 选择合适的精度(不要过度)
- 监控量化误差
- 必要时用浮点而非整数

步骤 5:监控离散化效果 ​

监控指标:
- 采样频率(实际 vs 设计)
- 采样丢失率(应该接近 0)
- 量化误差(应该 < 业务容忍)
- 离散化处理延迟

常见反模式 ​

反模式 1:采样频率过低 ​

症状:
- 数据更新慢
- 决策基于过时数据

后果:响应慢 / 决策错误
正解:根据业务响应要求调整采样

反模式 2:采样频率过高 ​

症状:
- 系统资源浪费
- 大量数据但用处不大

后果:资源浪费 / 系统变慢
正解:业务需求驱动的采样

反模式 3:离散化丢失信息 ​

症状:
- 离散化后的数据无法反映真实情况
- 例:活跃度变成 0/1,丢失了程度信息

后果:决策不准
正解:合理的离散化粒度

反模式 4:忽略抗混叠 ​

症状:
- 采样周期接近业务变化周期
- 高频波动被误认为低频趋势

后果:误判
正解:采样频率 ≥ 业务变化频率 × 2

工程实例 ​

实例 1:限流器的离散化 ​

需求:限制 QPS ≤ 1000

设计:令牌桶算法
- 桶容量 = 1000
- 补充速度 = 1000 个/秒
- 每个请求消耗 1 个令牌

离散化:
- 桶状态 = 整数(0-1000)
- 补充 = 离散的(每 1ms 补充 1 个)

参数:
- 桶容量(量化精度)
- 补充速度(采样频率)

效果:
- 突发流量被平滑
- 长期 QPS 被限制

实例 2:定时任务的离散化 ​

业务:每 5 分钟更新一次推荐

设计:
- 任务周期 = 5 分钟
- 执行时间 = 30 秒
- 下一个任务开始时间 = 当前任务结束 + 5 分钟 - 30 秒 = 4.5 分钟后

问题:
- 任务间存在"空白期"
- 实时性不足

改进:
- 改为滚动更新(每 30 秒更新一部分)
- 实时性高,但复杂度高

取舍:
- 业务容忍 5 分钟延迟 → 简单定时任务
- 业务需要实时 → 滚动更新

实例 3:监控采集的离散化 ​

需求:监控业务 QPS

设计:
- 采集频率 = 1 秒
- 存储 = 1 秒粒度

数据量:
- 1 天 = 86400 条数据
- 1 年 = 3000 万条数据

改进(降采样):
- 实时监控:1 秒粒度(最近 1 小时)
- 短期分析:1 分钟粒度(最近 1 天)
- 长期分析:1 小时粒度(最近 1 年)

效果:
- 存储减少 100 倍
- 不同粒度满足不同需求

性能指标 ​

离散化健康指标 ​

指标设计目标衡量方法
采样频率偏差< 10%实际频率 vs 设计
采样丢失率< 0.1%丢失采样 / 总采样
量化误差< 业务容忍|真实值 - 离散值|
离散化延迟< 采样周期处理时间

监控设计 ​

关键监控:
- 采样频率(实际 vs 设计)
- 采样丢失率
- 量化误差
- 离散化处理延迟

告警分级:
- P2:采样丢失率 > 1%
- P1:采样频率偏差 > 50%
- P0:离散化处理超时

边界判断 ​

何时不用 ​

场景 1:业务极简

- 没有定时任务
- 没有采样需求

→ 不需要离散化分析

场景 2:业务完全事件驱动

- 没有周期性操作
- 完全由事件触发

→ 离散化分析意义不大

场景 3:业务容忍高延迟

- 业务容忍小时级延迟
- 离散化影响小

→ 不需要精确离散化

与其他方法论的边界 ​

相邻概念区别
时滞时滞关注"延迟";本方法论关注"采样"
有限自动机有限自动机关注"状态机";本方法论关注"采样控制"
维纳滤波维纳滤波关注"信号去噪";本方法论关注"离散化"

何时升级(更精细的离散化) ​

当以下情况出现时,考虑升级:

1. 业务响应要求高 → 提高采样频率
2. 数据量爆炸 → 降采样策略
3. 量化误差大 → 提高精度
4. 抗混叠失效 → 加滤波

关键洞察 ​

钱学森 Ch 10 强调:随着数字计算机的普及,离散控制已经成为主流。

软件工程的本质就是离散——CPU 按指令周期执行,内存是离散的,数据是离散的。

离散化的核心是:

  1. 采样频率(不能太低丢失信息,不能太高浪费资源)
  2. 量化精度(不能太低丢失精度,不能太高浪费存储)
  3. 抗混叠(防止高频信号被误判)

好的离散化 = 在业务需求和系统开销间找到平衡。

相关链接 ​

IDDD 对位 ​

核心:离散控制 = 事件驱动——IDDD Ch 8 领域事件和 cybernetics Ch 10 离散系统同构。

从名家方法论与工程化思路中蒸馏出自己的工程体系。