fix: 将现有 worker 接入 portal 运行与优雅退出 #15

Closed
opened 2026-08-21 12:19:12 +08:00 by ila · 1 comment
Owner

基本信息

  • 类型:缺陷修复
  • 所属 Epic:#3
  • 所属 MVP / 版本:#4(MVP-0)
  • 阶段:已完成
  • 关联验收:#13

原始需求与发现

  • 来源:#10 已确认的“portal 内嵌 worker”和 #13 集成验收。
  • 提出时间:2026-08-21。
  • 事实:portal/worker 已实现并通过独立测试,但 portal/main.go 只启动 HTTP server,没有组装或运行 worker;真实 portal 提交会一直停留在 pending。

目标

恢复 #10 已确认行为:portal 进程启动时同时运行现有 worker,收到退出信号后停止认领并等待在途任务结束,使 #13 能验证真实运行闭环。

非目标

  • 不改变页面、HTTP API、数据库结构、生成状态机或 Provider 协议。
  • 不放宽 SSRF,不调用真实上游,不新增多 Provider、重试换家或独立 worker 服务。
  • 不修改同步提交链路调用上游的边界。

已确认方案

复用 #10 的既有设计和实现,不重新设计业务行为:

  • 在 portal 组合根创建 queue controller、AES-GCM key ring、SSRF 安全 HTTP client、Provider factory、catalog、本地存储适配和 worker。
  • 非生产使用受控默认 worker 参数;生产要求显式 worker/HTTP 参数,并校验 lease 大于请求超时和安全余量。
  • portal 与 worker 共用退出上下文;HTTP 停止接收请求,worker 停止新 claim 并等待在途任务,组件异常使进程失败关闭。
  • 增加组合根测试和配置测试;使用 mock/fixture,不访问真实 Provider。

影响与风险

  • 预计修改:portal/main.go、internal/config/、必要测试和长期运行文档。
  • 高风险边界:退出时序、租约、密钥和 SSRF;不得通过测试专用旁路进入生产组装。
  • 回退:停止 portal 并回退本工单提交;不修改或删除已有任务数据,running 任务由租约自然恢复。

验收标准

  • 真实 portal 进程会启动内嵌 worker,pending 可由 worker 认领。
  • 同步 handler 仍不调用上游,Provider 只经 SSRF 安全 client。
  • 生产缺少 worker/HTTP 配置或 lease 不满足安全余量时启动失败关闭。
  • TERM/Interrupt 停止新 claim、等待在途任务并关闭 HTTP;组件异常不会静默退出。
  • build、vet、race、mock 集成和 #13 运行闭环通过;工单停在待验收。

文档影响

  • 更新 Architecture-and-Code-Map、Local-Development-and-Verification、Deployment-and-Operations 中实际运行配置与退出方式。
  • Wiki 先改、回读 revision,再同步核心镜像。
  • 无长期文档影响。

实施与验证证据(2026-08-21)

  • portal/main.go 已组装现有 queue controller、AES-GCM key ring、SSRF safe client、catalog/factory、本地存储和 worker;worker 的 claim 实际经过 controller,退出后不再认领。
  • 新增生产显式配置门禁:lease、poll、Provider HTTP timeout、最大响应字节;lease 必须大于 HTTP timeout + 5 秒。测试暂停 worker 的开关只允许 CHORUS_ENV=test。
  • 组件生命周期测试覆盖等待在途 worker 和 worker 异常失败关闭;真实进程认领 6 个 pending、SSRF 拦截回环并通过 Ctrl+C 退出。
  • 实现提交 1ad8dca9cf9d4ac671a17193435baf3326682f66 已推送;全量 build/vet/race、MySQL mock 集成、Playwright、Harness 和 Wiki 镜像检查通过。详细矩阵见 #13。
  • Wiki revisions:Architecture b61f12999ae1、Local Development 31d2d641a46d、Deployment 80dac2704377。
  • 工单保持开启,等待用户验收;不关闭 MVP #4 或 Epic #3。

验收结论

  • 用户于 2026-08-21 明确确认 #15 验收通过。
  • 实现提交:1ad8dca9cf9d4ac671a17193435baf3326682f66;验收文档提交:3b54d50,均已推送到 main。
  • 任务归档 revision:063792eba900d63ca2e6ac61b95946c2047a93bc。
  • 工单已完成并关闭;MVP #4 仍等待单独验收。
## 基本信息 - 类型:缺陷修复 - 所属 Epic:#3 - 所属 MVP / 版本:#4(MVP-0) - 阶段:已完成 - 关联验收:#13 ## 原始需求与发现 - 来源:#10 已确认的“portal 内嵌 worker”和 #13 集成验收。 - 提出时间:2026-08-21。 - 事实:`portal/worker` 已实现并通过独立测试,但 `portal/main.go` 只启动 HTTP server,没有组装或运行 worker;真实 portal 提交会一直停留在 pending。 ## 目标 恢复 #10 已确认行为:portal 进程启动时同时运行现有 worker,收到退出信号后停止认领并等待在途任务结束,使 #13 能验证真实运行闭环。 ## 非目标 - 不改变页面、HTTP API、数据库结构、生成状态机或 Provider 协议。 - 不放宽 SSRF,不调用真实上游,不新增多 Provider、重试换家或独立 worker 服务。 - 不修改同步提交链路调用上游的边界。 ## 已确认方案 复用 #10 的既有设计和实现,不重新设计业务行为: - 在 portal 组合根创建 queue controller、AES-GCM key ring、SSRF 安全 HTTP client、Provider factory、catalog、本地存储适配和 worker。 - 非生产使用受控默认 worker 参数;生产要求显式 worker/HTTP 参数,并校验 lease 大于请求超时和安全余量。 - portal 与 worker 共用退出上下文;HTTP 停止接收请求,worker 停止新 claim 并等待在途任务,组件异常使进程失败关闭。 - 增加组合根测试和配置测试;使用 mock/fixture,不访问真实 Provider。 ## 影响与风险 - 预计修改:`portal/main.go`、`internal/config/`、必要测试和长期运行文档。 - 高风险边界:退出时序、租约、密钥和 SSRF;不得通过测试专用旁路进入生产组装。 - 回退:停止 portal 并回退本工单提交;不修改或删除已有任务数据,running 任务由租约自然恢复。 ## 验收标准 - [x] 真实 portal 进程会启动内嵌 worker,pending 可由 worker 认领。 - [x] 同步 handler 仍不调用上游,Provider 只经 SSRF 安全 client。 - [x] 生产缺少 worker/HTTP 配置或 lease 不满足安全余量时启动失败关闭。 - [x] TERM/Interrupt 停止新 claim、等待在途任务并关闭 HTTP;组件异常不会静默退出。 - [x] build、vet、race、mock 集成和 #13 运行闭环通过;工单停在待验收。 ## 文档影响 - [x] 更新 Architecture-and-Code-Map、Local-Development-and-Verification、Deployment-and-Operations 中实际运行配置与退出方式。 - [x] Wiki 先改、回读 revision,再同步核心镜像。 - [ ] 无长期文档影响。 ## 实施与验证证据(2026-08-21) - `portal/main.go` 已组装现有 queue controller、AES-GCM key ring、SSRF safe client、catalog/factory、本地存储和 worker;worker 的 claim 实际经过 controller,退出后不再认领。 - 新增生产显式配置门禁:lease、poll、Provider HTTP timeout、最大响应字节;lease 必须大于 HTTP timeout + 5 秒。测试暂停 worker 的开关只允许 `CHORUS_ENV=test`。 - 组件生命周期测试覆盖等待在途 worker 和 worker 异常失败关闭;真实进程认领 6 个 pending、SSRF 拦截回环并通过 `Ctrl+C` 退出。 - 实现提交 `1ad8dca9cf9d4ac671a17193435baf3326682f66` 已推送;全量 build/vet/race、MySQL mock 集成、Playwright、Harness 和 Wiki 镜像检查通过。详细矩阵见 #13。 - Wiki revisions:Architecture `b61f12999ae1`、Local Development `31d2d641a46d`、Deployment `80dac2704377`。 - 工单保持开启,等待用户验收;不关闭 MVP #4 或 Epic #3。 ## 验收结论 - 用户于 2026-08-21 明确确认 #15 验收通过。 - 实现提交:`1ad8dca9cf9d4ac671a17193435baf3326682f66`;验收文档提交:`3b54d50`,均已推送到 `main`。 - 任务归档 revision:`063792eba900d63ca2e6ac61b95946c2047a93bc`。 - 工单已完成并关闭;MVP #4 仍等待单独验收。
Author
Owner

任务归档已创建并在线回读:Task-15-将现有-worker-接入-portal-运行与优雅退出,revision 75e3f1cd61680034e20cdfdda675a24d1e33bb39。详细集成矩阵见 #13;工单保持待验收。

任务归档已创建并在线回读:`Task-15-将现有-worker-接入-portal-运行与优雅退出`,revision `75e3f1cd61680034e20cdfdda675a24d1e33bb39`。详细集成矩阵见 #13;工单保持待验收。
ila closed this issue 2026-08-21 14:07:53 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/chorus#15