关于 DavidHLPL · RHINE LAB RSS ↗
档案 X-1185 / 项目实践

Enhanced UISA:异构节点信息同步的 owner、边界与恢复模型

工程笔记

发布 / DavidHLPL

毕业条件(3 个可验证检查):

  1. 去除“规模/阈值”隐含承诺,改为可复现的重试/幂等约束描述;
  2. 补齐 owner → boundary → 恢复机制的最小决策树;
  3. 补齐 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 字段仍需实现方定稿:

  1. 首次注册用 Business ID 建立节点关系,中心生成长期使用的 System UUID,再发短期 Session Token。
  2. 普通请求携带 UUID、Token、时间戳、Nonce、签名和 Payload Hash;网关在进入核心链路前校验它们,避免伪造、篡改和重放。
  3. Agent 用合并心跳上报指标、插件/资产摘要和运行中任务;Gateway 校验、限流,正常负载可转发,高负载写入 MQ 后批量消费。
  4. 需要下发的任务先写入 Task DB 并生成全局 task_id,再按在线/离线状态直接下发或进入离线队列。
  5. 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 已给出统一的线协议或所有权实现。

最小验证

  1. 注册同一 Business ID 两次并重放旧 Nonce:身份绑定保持唯一,过期/重放请求被拒绝。
  2. 提交同一 task_id 两次:只有一次状态推进和审计记录,重复请求返回可识别结果。
  3. 并发提交旧版本 Diff:乐观锁冲突可观测,系统重拉版本并重新计算,而不是覆盖新数据。
  4. 节点离线后生成任务,再恢复心跳:任务从队列唤醒;过期任务转失败且保留原因。
  5. 发送错误 Hash/签名和不可用能力声明:载荷被拒绝或任务被跳过,并有安全/审计证据。
  6. 对插件版本制造超过阈值的失败回执:熔断阻断后续动作,解除前不能由普通心跳绕过。

证据与不确定性

  • 来源事实:legacy-uisa-architecture-design 描述双重身份、短期 Token、签名/Hash/Nonce 校验、MQ 削峰、版本与 Diff、离线队列、任务状态机、乐观锁、审计与故障矩阵。
  • 来源事实:legacy-plugin-lifecycle-management 描述合并心跳、插件当前/目标版本与状态、操作防重、能力过滤、灰度/熔断和回执恢复。
  • 本页综合:把两者映射到 owner/boundary,并将插件安全门作为通用任务同步之上的领域策略层;Trade-offs 表是跨来源比较。
  • 未确认项:生产容量、跨服务事务边界、密钥轮换、协议版本协商、租户隔离细节和真实故障率均未由 raw 证明。

相关页面

来源与关联文档

研究记录

  1. 原始文档: src/content/note/zh-cn/uisa-architecture-design.md
  2. 来源版本: f49953fb0d4bd52a39bf81167b0c4b7dd7d78a64
  3. 证据状态: 暂定

原文来源 ↗