Files
orbit/docs/reports/phase-2-server.md

4.7 KiB
Raw Blame History

P2 服务端执行与 WSS 阶段记录

日期:2026-09-17。这是 P2 的阶段内进展,不是 P2 或生产验收完成。

实现

新增 WorkerInstance 与 AttemptEvidence,当前共 32 个持久化实体。字段、模型职责、单位、可空/秘密/代次语义及 SQL COMMENT 均为中文。新增前向迁移 000003_worker_execution,旧迁移不改写。

服务端现有能力包括进程恢复秘密、会话头与连接代次、能力绑定、容量覆盖和排空、两步领取/开始、尝试秘密、续租、结果回执、迟到证据、跨节点恢复,以及到期扫描。队列并发许可随执行事务领取、续期和释放。

HTTP 进程已注册 Worker WebSocket 入口,并启动受控恢复扫描;使用有界网络队列、消息/连接上限和明确的关闭流程。默认 bootstrap 不扩权,新增 --worker-access 显式为开发凭据增加 Worker 权限。

实际回归

环境:macOS arm64,Go 1.27.1,Docker 隔离 MySQL 8.4.10。入口为 make test、make vet、make build、make integration;数据库临时创建并清理,不使用已有业务数据库。

场景 结果
新迁移与全部 Go 模型字段匹配、前序 P0/P1 回归 通过
开始/续租/结果确认的原消息重报 原回执可查,不重复执行状态变更或延长旧续租
多消息提交同一已保存结果 只产生一次结果事件与审计、只释放一次许可
精确整数与小数结果 保存与查询不损失数值内容
不同节点重连与恢复同一尝试 原子迁移会话;次数和许可不增加
旧会话、错误尝试秘密、错误进程证明、注册内容改变 拒绝
两个实例、两个节点、16 个并发领取请求 队列并发 2、进程容量各 1 均不被突破
重连时旧会话已有执行 不重置容量计数
排空、容量零、重复/冲突序号 不给新工作,不误释放已有许可,排空跨重连保留
前 18 个任务门控暂停,后面有普通任务 普通任务仍能被领取,无候选页饥饿
暂停与开始、已授权开始回执、结果保存 未开始被阻止;已开始的原回执和结果仍可保存
未开始到期、已开始失联、两个恢复节点竞争 有限重派/FAILED/NEEDS_REVIEW 正确;无重复释放
迟到成功、未开始提交结果、冲突结果 EVIDENCE_ONLY,保留证据,不改写权威结果
原 start ACK 在结束或过期后重报 receipt 保留,当前 lease.active=false
单次绝对时限与会话过期 续租不能越过限制,过期会话不能靠心跳复活
获取锁之前进入请求、锁等待期间租约过期 不使用早先时钟样本批准开始
领取事件或完成审计 INSERT 被注入失败 任务、尝试、许可、回执、事件整体回滚
凭据撤销、跨命名空间、已取消 context 执行控制拒绝
WSS 真 TLS 握手,鉴权/子协议/Origin/URL 规则 通过;使用受信任测试证书,不跳过验证
WSS 节点 A 派发开始 → 断开 → 节点 B 恢复 → 结果确认重报 同一尝试、一次成功事件、许可正确释放
重复 JSON 字段、服务关闭与已接管长连接 非法帧关闭;节点关闭无残留长连接

WSS 测试客户端直接发送协议帧,并显式重连到另一个测试服务器。当前没有把这项测试说成 SDK 自动重连或真实主机宕机演练。两个 ExecutionStore/Hub 使用不同节点 ID、同一个真实数据库;它们位于同一测试进程。

事务与恢复约束

每条命令重新校验当前凭据。执行路径先锁进程头/会话,再锁队列、可选门控、任务、尝试;回收从队列开始,不反向锁 Worker。拿到相关锁后重新读取数据库时间。状态、回执、额度和事件在短事务内提交,处理器不会在数据库事务中运行。

会话秘密、执行秘密仅存摘要,普通任务查询与日志不输出原文。保存迟到证据不构成执行授权。粗粒度队列锁是当前正确性基线,需要后续执行计划、压力与公平性验证;没有声称支持某个生产吞吐数字。

剩余工作

  • Worker SDK 的处理器注册与运行循环、保守租约截止、自动续租、重连、结果重报、优雅退出。
  • API/SDK 执行历史与证据查询,WS JSON Schema 和兼容性验证。
  • 运行中取消、客户端慢消费及更多网络故障、结果未知/不协作处理器的端到端用例。
  • P3 的策略化自动重试、速率和其他配额、调度及结果订阅。
  • P4–P7 的流程、运维、性能和最终交付验证。

当前已实现的是可以经 WSS 操作的服务端执行内核。尚未完成独立 Worker 接入交付,也未完成生产高可用和容量验收。