适用范围
约束所有涉及时限、容量、并发与时钟的功能,规定这些量的口径与相互约束,并要求各功能显式声明具体取值。
不约束:具体取值的最终选择(由各功能在其中声明,且必须满足本规格的相互约束);硬件与网络容量规划。
规范条款
时限基线
- 涉及有效期的功能必须声明四个量,且必须满足下列相互约束:
| 量 | 含义 | 相互约束 |
|---|
| 租约时长 | 有效期总长度 | 必须 ≥ 最小支持值,且 ≤ 最大支持值 |
| 心跳间隔 | 续约节奏 | 必须 ≤ 租约时长 ÷ 3 |
| 结算时限 | 从期望变更到必须结算完毕的时限 | 必须 ≤ 租约时长 |
| 看门狗阈值 | 判定停滞并强制终止的阈值 | 必须 < 最小支持租约时长 |
- 必须声明最小与最大支持租约时长;必须满足:最大 ≥ 最小 × 2。
- 一切到期比较必须以服务端时钟为准;必须不设客户端宽限期(必须遵循API 与传输)。
- 客户端本地截止必须只用于更早收敛;必须不用于延后判定。
- 任何"必须在时限内完成"的要求必须给出:起点、终点、超时后的行为。
超时后的行为
- 每个时限必须声明超时行为,且必须落在下列之一:
| 超时行为 | 适用 |
|---|
| 收敛为失败 | 状态无法确定或副作用不可逆 |
| 重试 | 操作幂等且可安全重复 |
| 降级 | 有明确的安全降级路径 |
| 告警并保持 | 需要人工介入且不能自动处置 |
- 必须不存在"超时后无行为"的时限;必须不以静默继续代替超时处置。
- 超时判定必须由权威方(通常为服务端)执行;必须不依赖客户端自述超时。
重放与重试上界
- 无工作类结果必须声明有界重放窗口,且必须 ≤ 租约时长(必须遵循幂等与一致性)。
- 自动重试必须有上界,且必须同时声明次数与总时长上界;必须不只声明其一。
- 触达上界必须产生告警并转为人工处理。
并发口径
- 每个功能必须声明其并发度:同一作用域内允许同时进行的执行数。
- 并发度必须是显式设计选择,并必须说明该选择是稳态设计还是阶段性权衡;必须不隐含为"未定义"。
- 若并发度为 1,必须声明"第二请求如何处置"(拒绝 / 排队 / 冲突)。
- 需要本地单实例的场景必须声明:必须不把本地锁当作跨进程或跨主机的权威判据。
容量口径
- 每个功能必须声明下列容量上界,必须不留空:
| 必须声明的上界 | 说明 |
|---|
| 单批事件 / 消息大小 | 含条目数与总字节数的口径 |
| 单次操作涉及的对象数 | 例如子任务、子代理、批量条目 |
| 单作用域并发对象数 | 与并发度一致或更严 |
| 重试与重放窗口 | 与时限基线一致 |
- 超出上界必须失败关闭;必须不静默截断、丢弃或部分处理。
- 上界必须同时作为成本上界与攻击面上限声明理由。
- 允许的时钟偏移必须显式声明;必须不假设各参与者时钟一致。
- 服务端时间必须由服务端写入;必须不接受客户端提交的时间作为权威。
- 依赖单调性的量(序号、修订、代际)必须由服务端生成并保证单调;必须不依赖时间戳实现单调性。
声明与校验
- 上述四类口径必须在功能的设计文档中集中声明一处,且必须可被检查;必须不散落在多处。
- 取值变更必须按版本与兼容判定兼容性;必须不静默调整。
违反时的失败语义
| 违反情形 | 必须的行为 |
|---|
| 时限四量缺失或违反相互约束 | 视为规格违反;评审阶段必须拦截 |
| 时限无超时行为 | 必须补超时行为 |
| 无界重试或无界重放窗口 | 必须补上界 |
| 并发度未声明 | 必须显式声明 |
| 容量上界留空 | 必须补齐 |
| 超上界时静默截断 | 必须改为失败关闭 |
| 以客户端时间为权威 | 必须改为服务端时间 |
校验方式
| 校验对象 | 判据 | 失败表现 |
|---|
| 时限约束 | 心跳间隔 ≤ 租约 ÷ 3;结算时限 ≤ 租约;看门狗阈值 < 最小租约 | 任一不满足即失败 |
| 租约范围 | 最大 ≥ 最小 × 2 | 不满足即失败 |
| 超时行为 | 每个时限必须能定位到超时行为 | 缺失即失败 |
| 上界存在 | 重放窗口与自动重试必须均有显式上界 | 无界即失败 |
| 并发度显式 | 并发度必须可定位到声明,且说明权衡性质 | 未声明即失败 |
| 容量完整 | 四类容量上界必须全部有值 | 留空即失败 |
| 超界行为 | 构造超上界输入必须失败关闭 | 静默截断即失败 |
| 时钟权威 | 篡改客户端时间不得改变判定 | 改变即失败 |
| 单调性来源 | 序号 / 修订 / 代际必须由服务端生成 | 由客户端生成即失败 |
相关规格