6.8 KiB
P2 Worker 执行闭环阶段验收
日期:2026-09-17。P2 已实现并通过阶段回归,此报告汇总本地正确性/故障证据。全平台首版仍需完成 P3–P7;本地多进程接管不能替代跨主机、数据库高可用和容量验收。
阶段交付范围
服务端已经提供持久化 Worker 会话、能力及绝对容量、两步领取/开始、续租、结果回执、排空、租约回收,以及尝试/证据查询。独立 Go SDK 提供底层连接控制和自动 Worker 运行器。机器契约、Markdown 接口、运行示例与测试一同交付。
文档入口:Worker 契约、JSON Schema 说明、自动 Worker、执行历史。
环境及复现
macOS arm64、Go 1.27.1、Docker 中的单实例 MySQL 8.4.10。服务和子进程使用回环随机端口;WSS 网关使用受信任测试证书,不跳过 TLS 校验。所有故障只影响脚本创建的临时数据库、专用凭据及子进程。
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;执行历史回归 |
| 独立 SDK 与实际接入 | GOWORK=off 回归;health、tasks、worker-protocol、worker、history 五个例子在真实服务上运行 |
更细的历史证据分别在 服务端记录、SDK 协议、自动运行器 和 执行历史。旧记录中的“下一步”描述当时阶段,本报告及持续计划反映当前进度。
契约修正
数组内对象现在同样拒绝字段大小写别名,例如 capabilities 中的 Handler 不再被当作 handler。Worker 控制请求必须显式提供必填字段,计数字符串必须规范且不溢出,请求不能携带响应字段的空值/null。现有 SDK 一直发送完整规范数据,所有接入示例继续通过。首版 SDK 尚未发布,对自研开发期客户端的兼容影响见 Schema 说明。
遗留范围与后续阶段
- P3:策略性安全重试、运行中取消、计划触发、漏跑策略、配额/背压及可靠结果订阅。
- P4–P5:完整 Weave 定义发布、流程推进、等待/查询、管理与恢复。
- P6:MySQL 不可用/切主、跨主机故障、滚动升级、备份恢复、负载与容量报告、凭据轮换及运维。
- 更广的故障矩阵继续包含真实 HTTP 受理 ACK 丢失、派发消息未送达时进程崩溃、慢消费者/重连风暴及清理竞争;当前不把相邻测试推断为这些场景已经验收。
进程故障测试中的外部文件仅表示已发生但未上报的工作,不模拟真实业务渠道的全部事务。SDK 未确认结果仍在进程内存;Worker 重启不能自动找回它。平台按租约和安全等级保留未知状态,后续由核查及业务幂等协议处理。没有端到端 exactly-once、生产 RPO/RTO 或峰值容量承诺。