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

70 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# P2 Worker 执行闭环阶段验收
日期:2026-09-17。P2 已实现并通过阶段回归,此报告汇总本地正确性/故障证据。全平台首版仍需完成 P3–P7;本地多进程接管不能替代跨主机、数据库高可用和容量验收。
## 阶段交付范围
服务端已经提供持久化 Worker 会话、能力及绝对容量、两步领取/开始、续租、结果回执、排空、租约回收,以及尝试/证据查询。独立 Go SDK 提供底层连接控制和自动 Worker 运行器。机器契约、Markdown 接口、运行示例与测试一同交付。
文档入口:[Worker 契约](../api/worker.md)、[JSON Schema 说明](../api/worker-schema.md)、[自动 Worker](../sdk/worker-runtime.md)、[执行历史](../api/execution-history.md)。
## 环境及复现
macOS arm64、Go 1.27.1、Docker 中的单实例 MySQL 8.4.10。服务和子进程使用回环随机端口;WSS 网关使用受信任测试证书,不跳过 TLS 校验。所有故障只影响脚本创建的临时数据库、专用凭据及子进程。
```sh
make test
make vet
make build
make integration
cd sdk/go
GOWORK=off go test -race ./...
GOWORK=off go vet ./...
```
脚本先完成数据库与协议集成测试、真实服务及五个 SDK 示例,再停止原服务,进入独立进程故障测试,避免原节点的恢复扫描器掩盖新节点接管。凭据通过环境及 0600 文件传递,不进入 URL 或输出。故障通过 Process.Kill 注入,必须由 Wait 确认目标被信号终止;结束后回收所有测试子进程及容器。
Schema 验证器仅被测试包引用。服务二进制依赖图中不包含 jsonschema 验证器,SDK go.mod 没有新增依赖。当前协议输入由严格解码器、类型及事务校验器处理。
## 本轮新增证据
| 用例 | 注入与断言 |
| --- | --- |
| TestWorkerPublishedContract | 所有客户端类型与服务端响应形状通过 Schema;变异报文同时经 Schema/真实应用输入校验拒绝;重复键、非法 Unicode、超范围数字在原始字节层拒绝 |
| TestIntegrationWorkerWebSocket | 实际 WSS 报文逐条校验 Schema,包括注册、容量、派发、开始、续租、恢复、完成和公开错误 |
| TestIntegrationWorkerProcessACKRecovery | 三个不同 node ID 的真实 Orbit 进程:A 提交 start 后网关丢 ACK 并暂停重连,强杀 A;切到 B 后恢复同一尝试,再执行处理器;B 提交 finish 后丢 ACK 并强杀 B,启动 C 核对原回执 |
| ACK 恢复的持久化核对 | 初始开始时间及尝试 ID 不变,会话归属发生迁移;处理器仅一次,任务仅一次尝试;C 返回同一成功结果及版本,没有额外冲突证据;SDK 正常排空 |
| TestIntegrationWorkerProcessCrashUnknown | 真实 Worker 子进程写入并同步外部工作标记后被强杀,同时强杀原 Orbit;只有新 Orbit 执行恢复扫描,任务进入 NEEDS_REVIEW、尝试 UNKNOWN,未伪造结果;已用 1 次、上限 3 次,不因恢复重置 |
| 强杀后的许可核对 | 使用 max_concurrency=1 的专用队列;新 Worker 消费同能力的探针任务成功,原未知任务没有再次执行,证明许可可继续使用而原任务仍等待核查 |
初次运行发现强杀用例的专用队列缺少必填速率值,被真实 API 正确拒绝。补齐测试配置后重新执行完整回归。没有通过绕开参数校验让用例成功。
## P2 要求与证据对应
| 要求 | 主要测试与记录 |
| --- | --- |
| WSS、协议与身份权限 | TestIntegrationWorkerWebSocket 的 handshake 子用例;TestIntegrationWorkerExecution 的 authority 子用例;本轮 Schema 契约回归 |
| 能力/队列/进程容量与排空 | multi_node_claim_obeys_queue_and_process_capacity、drain_is_durable_and_capacity_sequence_is_not_additive;自动 Worker 并发与有界收尾测试 |
| 开始前校验、旧会话隔离 | paused_gate_blocks_start_but_not_saved_result、cross_node_resume_fences_old_session_and_requires_secrets、lock_wait_does_not_reuse_an_earlier_clock_sample |
| 租约、总/单次时限与回收 | attempt_timeout_and_session_expiry_cap_renewal、recovery_is_bounded_and_unknown_effects_are_not_replayed;自动运行器跨首次租约 32 秒执行及到期取消测试 |
| 结果原身份核对、证据与事务 | durable_start_renew_and_exact_result_confirmation、result_event_failure_rolls_back_task_receipt_and_permit、finish_without_start_is_only_evidence_and_cannot_free_capacity;SDK ACK 丢失与本轮进程强杀 |
| 自动运行器恢复及执行次数 | TestIntegrationWorkerRuntimeACKLossRenewAndDrain、OutageCancelsAndReplaysEvidence、Concurrency;本轮 ProcessACKRecovery |
| 未知效果与不协作处理器 | TestIntegrationWorkerRuntimeUnknownAndUncooperativeShutdown、LeaseLossCancelsAndDoesNotRevive;本轮 ProcessCrashUnknown |
| 历史、权限、稳定分页和载荷 | TestIntegrationTaskHistory、TestIntegrationWorkerConnectionHistoryAndPayloadBounds;[执行历史回归](phase-2-execution-history.md) |
| 独立 SDK 与实际接入 | GOWORK=off 回归;health、tasks、worker-protocol、worker、history 五个例子在真实服务上运行 |
更细的历史证据分别在 [服务端记录](phase-2-server.md)、[SDK 协议](phase-2-sdk-protocol.md)、[自动运行器](phase-2-worker-runtime.md) 和 [执行历史](phase-2-execution-history.md)。旧记录中的“下一步”描述当时阶段,本报告及持续计划反映当前进度。
## 契约修正
数组内对象现在同样拒绝字段大小写别名,例如 capabilities 中的 Handler 不再被当作 handler。Worker 控制请求必须显式提供必填字段,计数字符串必须规范且不溢出,请求不能携带响应字段的空值/null。现有 SDK 一直发送完整规范数据,所有接入示例继续通过。首版 SDK 尚未发布,对自研开发期客户端的兼容影响见 [Schema 说明](../api/worker-schema.md)。
## 遗留范围与后续阶段
- P3:策略性安全重试、运行中取消、计划触发、漏跑策略、配额/背压及可靠结果订阅。
- P4–P5:完整 Weave 定义发布、流程推进、等待/查询、管理与恢复。
- P6:MySQL 不可用/切主、跨主机故障、滚动升级、备份恢复、负载与容量报告、凭据轮换及运维。
- 更广的故障矩阵继续包含真实 HTTP 受理 ACK 丢失、派发消息未送达时进程崩溃、慢消费者/重连风暴及清理竞争;当前不把相邻测试推断为这些场景已经验收。
进程故障测试中的外部文件仅表示已发生但未上报的工作,不模拟真实业务渠道的全部事务。SDK 未确认结果仍在进程内存;Worker 重启不能自动找回它。平台按租约和安全等级保留未知状态,后续由核查及业务幂等协议处理。没有端到端 exactly-once、生产 RPO/RTO 或峰值容量承诺。