Enhanced UISA:异构节点信息同步的 owner、边界与恢复模型
工程笔记
发布 / DavidHLPL
毕业条件(3 个可验证检查):
- 去除“规模/阈值”隐含承诺,改为可复现的重试/幂等约束描述;
- 补齐 owner → boundary → 恢复机制的最小决策树;
- 补齐 5 类异构节点失败模式矩阵并有具体测试用例支撑。
定义
本页不是把 UISA 再讲成四层架构图,而是综合两个 raw 来源回答:当通用信息同步与插件生命周期控制面相遇时,谁拥有哪种状态,消息如何同步,失败如何重试和审计,以及哪些性能与安全权衡必须显式裁决。结论仍是 provisional;它整理了设计模型,未证明某个具体部署可达成来源中的规模目标。
核心机制
1. Owner / boundary:按状态所有权切分职责
| Owner | 边界内拥有的事实 | 不应越界承担 |
|---|---|---|
| Edge Agent | 节点身份持有、采集、插件执行、本地缓存与版本 | 中心策略的最终裁决 |
| Secure Gateway | 鉴权、协议转换、限流、连接治理、离线任务转发 | 资产与任务的长期真相 |
| Sync Engine | 调度、Diff、任务状态机、版本冲突处理、重试 | 端上实际执行结果的臆测 |
| Durable stores | 身份、资产快照、任务、时序和审计记录 | 直接替代执行器下发动作 |
| Plugin policy | desired/current/ack/failure、能力门槛、灰度和熔断 |
通用资产同步的全部规则 |
这条边界意味着:Agent 的 current 是观测,策略服务的 desired 是意图,任务库的状态是可恢复的控制记录;Gateway 可以削峰,但不能把内存中的转发成功当成任务完成。
2. 同步协议:注册、心跳、任务、回执形成闭环
协议最小顺序如下,具体 HTTP/RPC 字段仍需实现方定稿:
- 首次注册用
Business ID建立节点关系,中心生成长期使用的System UUID,再发短期Session Token。 - 普通请求携带 UUID、Token、时间戳、Nonce、签名和 Payload Hash;网关在进入核心链路前校验它们,避免伪造、篡改和重放。
- Agent 用合并心跳上报指标、插件/资产摘要和运行中任务;Gateway 校验、限流,正常负载可转发,高负载写入 MQ 后批量消费。
- 需要下发的任务先写入
Task DB并生成全局task_id,再按在线/离线状态直接下发或进入离线队列。 - Agent 返回
NoChange、Diff 数据或执行失败;引擎验证 Hash/签名,用版本条件更新资产,成功才写审计并清理对应队列。
register -> heartbeat -> persist(task_id) -> dispatch|queue
-> ack/diff -> validate -> versioned write -> audit
3. 可靠性与幂等:多层约束共同收敛
| 约束 | 防止的问题 | 可观察结果 |
|---|---|---|
task_id 幂等 |
重复投递、重放 | 同一任务不会重复完成 |
| 版本 + 乐观锁 | 并发覆盖 | 更新影响行数为 0 时重新拉取并计算 Diff |
| Payload Hash / 签名 | 数据篡改、来源伪造 | 拒绝载荷并记录安全事件 |
| 有限重试 + TTL | 无限重试、离线堆积 | 到期转 Failed,保留原因 |
| 审计快照 + Diff | 无法回放和修复 | 可追踪变更前后状态 |
| 插件操作键 + 灰度/熔断 | 危险动作重复或全量扩散 | 阻断原因、回执和失败率可追踪 |
通用同步以“可观测、可恢复、可收敛”的最终一致为目标。插件页的 desired/current/ack/failure 是该任务状态机在插件域的具体投影,而不是另一套独立的真相。
4. 异构节点:能力矩阵先于统一下发
| 节点/环境 | 需要适配的差异 | 允许的策略 |
|---|---|---|
| ECS / 物理机 | 身份来源、OS、架构、网络路径 | Agent 采集 + 版本/Hash 增量同步 |
| 边缘节点/网关 | 间歇连接、代理转发、带宽约束 | 本地缓存、离线队列、恢复后唤醒 |
| 容器 | systemd、内核模块权限、文件系统可能受限 | 插件白名单;不支持项直接跳过 |
| 无 root/只读/Serverless | 无法安装服务或持久写入 | 能力过滤,不把失败当作可重试安装 |
| 安全加固环境 | 脚本执行可能被拦截 | 显式协议/执行器适配并记录失败 |
统一 Agent 与协议适配器可以隐藏传输差异,但不能抹掉能力边界;每个插件或任务仍需声明前置条件。
5. 失败恢复:离线是生命周期状态,不是异常分支
| 故障 | 控制面动作 | 恢复/终止条件 |
|---|---|---|
| 网络中断或 Agent 离线 | 标记 Offline,任务进离线队列 |
心跳恢复后唤醒;TTL 到期转失败 |
| Gateway 宕机 | 负载均衡切换,Token/队列状态保留在持久化外部存储 | 重新接入后继续未完成任务 |
| MQ 堆积 | 扩容消费者,降低非核心遥测 | 批量消费追平积压 |
| Hash/签名失败 | 丢弃载荷,写安全日志 | 强制全量同步或人工调查 |
| 乐观锁冲突 | 重新读取最新版本并重算 Diff | 自动重试至上限 |
| DB 写入失败 | 任务保持 Pending,不假报成功 |
DB 恢复后重试 |
| 插件版本失败率过高 | 打开熔断,阻断后续安装/升级 | 人工解除或新的观察窗口 |
插件状态可先逻辑离线、后按保留期分批清理;资产同步则通过全量修复处理 Hash 异常、版本链断裂或多次增量失败。
6. Trade-offs:没有免费的“高可靠”
| 选择 | 得到 | 付出的代价 |
|---|---|---|
| 最终一致而非强同步 | 对离线和抖动有韧性 | 读取方必须接受滞后并依赖补偿 |
| 增量 + Hash/Diff | 常态传输和写入成本低 | 需要版本链;异常时要全量修复 |
| 任务先落库 | 可恢复、可审计 | 延迟、存储和状态机复杂度增加 |
| 合并心跳 + MQ | 削峰并减少请求 | 处理链异步,观测不是即时的 |
| 长连接直推 | 轻量操作低延迟 | 依赖连接稳定,不适合复杂安装 |
| 脚本代理 | 多步骤操作可审计、可控 | 链路更长,需要额外执行能力 |
| 灰度 + 熔断 | 限制错误插件的爆炸半径 | 发布速度下降,阈值和人工流程增加 |
适用条件
- 同一平台同时管理 ECS、IDC 物理机、边缘节点或容器等异构来源。
- 任务可能在节点离线时产生,且必须在恢复后继续、过期或可审计地失败。
- 业务可以接受最终一致,并愿意为任务库、审计库、MQ/缓存和补偿任务付出运维成本。
- 端侧能够持有稳定系统身份、短期令牌、本地版本/缓存,并按能力声明执行器。
不适用与风险
- 不能把 owner/boundary 表当作可直接部署的产品拓扑;数据分片、租户隔离、密钥生命周期和协议版本仍未裁决。
- 不适合要求所有节点实时强一致、永久在线或同一套安装命令适用于所有 OS/权限环境的场景。
- UISA raw 没有生产容量基准;百万级只出现在插件 raw 的说明性场景,不能外推 QPS、SLO 或成本。
- Token 有效期、离线 TTL、单节点积压上限、灰度比例和熔断阈值均是示例,必须用真实失败分布校准。
- 增量同步依赖稳定资产键与版本链;Hash 不一致或链断裂时全量修复的流量和锁竞争需要单独评估。
- 本页把插件控制面接到通用同步协议上是综合结论,不代表两个 raw 已给出统一的线协议或所有权实现。
最小验证
- 注册同一
Business ID两次并重放旧 Nonce:身份绑定保持唯一,过期/重放请求被拒绝。 - 提交同一
task_id两次:只有一次状态推进和审计记录,重复请求返回可识别结果。 - 并发提交旧版本 Diff:乐观锁冲突可观测,系统重拉版本并重新计算,而不是覆盖新数据。
- 节点离线后生成任务,再恢复心跳:任务从队列唤醒;过期任务转失败且保留原因。
- 发送错误 Hash/签名和不可用能力声明:载荷被拒绝或任务被跳过,并有安全/审计证据。
- 对插件版本制造超过阈值的失败回执:熔断阻断后续动作,解除前不能由普通心跳绕过。
证据与不确定性
- 来源事实:
legacy-uisa-architecture-design描述双重身份、短期 Token、签名/Hash/Nonce 校验、MQ 削峰、版本与 Diff、离线队列、任务状态机、乐观锁、审计与故障矩阵。 - 来源事实:
legacy-plugin-lifecycle-management描述合并心跳、插件当前/目标版本与状态、操作防重、能力过滤、灰度/熔断和回执恢复。 - 本页综合:把两者映射到 owner/boundary,并将插件安全门作为通用任务同步之上的领域策略层;Trade-offs 表是跨来源比较。
- 未确认项:生产容量、跨服务事务边界、密钥轮换、协议版本协商、租户隔离细节和真实故障率均未由 raw 证明。
相关页面
来源与关联文档
研究记录
- 原始文档: src/content/note/zh-cn/uisa-architecture-design.md
- 来源版本: f49953fb0d4bd52a39bf81167b0c4b7dd7d78a64
- 证据状态: 暂定