[M-AI-01-05] 完善独立 NestJS Worker 启动与生命周期 #249

Closed
opened 2026-06-19 20:06:04 +08:00 by wangdl · 1 comment
Owner

背景

worker.main.ts 已存在但未被独立使用。Worker 当前通过 Dockerfile 隐式启动,缺少 instanceId、健康检查和优雅关闭。

目标

Worker 作为正式独立进程运行:

  • 完善 worker.main.ts
  • 新增 start:worker 脚本
  • 增加 Worker instanceId
  • 启动时输出版本、队列、concurrency
  • 校验 MySQL、Redis 和必要配置
  • 启用 shutdown hooks
  • SIGTERM 下停止获取新任务并等待当前任务完成

非目标

  • 不新增 Job 状态
  • 不实现 Worker HTTP health server
  • 不修改业务 Processor

风险等级:P1

依赖:M-AI-01-03, M-AI-01-04

建议执行顺序:5

验收标准

  • npm run start:worker 可独立启动
  • 不监听 HTTP 端口
  • Redis 不可用时给出明确状态和日志
  • 必需配置缺失时启动失败
  • SIGTERM 下优雅关闭
  • 退出码符合成功/失败语义
## 背景 worker.main.ts 已存在但未被独立使用。Worker 当前通过 Dockerfile 隐式启动,缺少 instanceId、健康检查和优雅关闭。 ## 目标 Worker 作为正式独立进程运行: - 完善 worker.main.ts - 新增 start:worker 脚本 - 增加 Worker instanceId - 启动时输出版本、队列、concurrency - 校验 MySQL、Redis 和必要配置 - 启用 shutdown hooks - SIGTERM 下停止获取新任务并等待当前任务完成 ## 非目标 - 不新增 Job 状态 - 不实现 Worker HTTP health server - 不修改业务 Processor ## 风险等级:P1 ## 依赖:M-AI-01-03, M-AI-01-04 ## 建议执行顺序:5 ## 验收标准 - [ ] npm run start:worker 可独立启动 - [ ] 不监听 HTTP 端口 - [ ] Redis 不可用时给出明确状态和日志 - [ ] 必需配置缺失时启动失败 - [ ] SIGTERM 下优雅关闭 - [ ] 退出码符合成功/失败语义
wangdl added this to the M-AI-01 Worker 进程边界与部署收口 milestone 2026-06-19 20:06:04 +08:00
Author
Owner

开发完成评论

完成内容

  • 重写 worker.main.ts:正式独立 Worker 进程入口
    • generateInstanceId()worker-{hostname}-{pid}-{timestamp} 唯一标识
    • validatePrerequisites():顺序校验 MySQL(SELECT 1)、Redis(get)、必需配置键(database.url/redis.host/jwt.secret),任一失败 exit(1)
    • 启动时输出全部 6 个队列的 concurrency/attempts/backoff 配置
    • app.enableShutdownHooks() + SIGTERM/SIGINT 处理:停止获取新任务,等待当前任务完成后 app.close()
    • 退出码:成功 0,失败 1
  • 新增 start:worker 脚本:node dist/worker.main

修改文件

  • src/worker.main.ts(重写)
  • package.json(新增 start:worker 脚本)

代码证据

  • src/worker.main.ts:9-13:instanceId 生成 worker-{hostname}-{pid}-{timestamp}
  • src/worker.main.ts:22-29:MySQL 校验 — prisma.$queryRawSELECT 1``,失败 exit(1)
  • src/worker.main.ts:32-38:Redis 校验 — redis.get(__worker_health_check__),失败 exit(1)
  • src/worker.main.ts:41-52:配置键校验 — 缺失或 placeholder(change_me 开头)→ exit(1)
  • src/worker.main.ts:62createApplicationContext(WorkerModule) — 不监听 HTTP 端口
  • src/worker.main.ts:70-81:启动时输出队列配置
  • src/worker.main.ts:88-101:SIGTERM/SIGINT → app.close() → exit(0);异常 → exit(1)
  • package.json:15"start:worker": "node dist/worker.main"

测试情况

  • 已运行命令:
    • npx tsc --noEmit
    • npx jest --no-coverage
  • 结果:
    • TypeScript 编译:通过(0 新增错误)
    • 单元测试:283/283 全部通过,12 suites 全部通过

未完成 / 风险

  • Worker 启动校验无法在单元测试中验证(需要真实 MySQL/Redis),集成测试在 M-AI-01-08 中覆盖

是否建议进入 Review

## 开发完成评论 ### 完成内容 - 重写 `worker.main.ts`:正式独立 Worker 进程入口 - `generateInstanceId()`:`worker-{hostname}-{pid}-{timestamp}` 唯一标识 - `validatePrerequisites()`:顺序校验 MySQL(SELECT 1)、Redis(get)、必需配置键(database.url/redis.host/jwt.secret),任一失败 exit(1) - 启动时输出全部 6 个队列的 concurrency/attempts/backoff 配置 - `app.enableShutdownHooks()` + SIGTERM/SIGINT 处理:停止获取新任务,等待当前任务完成后 `app.close()` - 退出码:成功 0,失败 1 - 新增 `start:worker` 脚本:`node dist/worker.main` ### 修改文件 - `src/worker.main.ts`(重写) - `package.json`(新增 start:worker 脚本) ### 代码证据 - `src/worker.main.ts:9-13`:instanceId 生成 `worker-{hostname}-{pid}-{timestamp}` - `src/worker.main.ts:22-29`:MySQL 校验 — `prisma.$queryRaw`SELECT 1``,失败 exit(1) - `src/worker.main.ts:32-38`:Redis 校验 — `redis.get(__worker_health_check__)`,失败 exit(1) - `src/worker.main.ts:41-52`:配置键校验 — 缺失或 placeholder(`change_me` 开头)→ exit(1) - `src/worker.main.ts:62`:`createApplicationContext(WorkerModule)` — 不监听 HTTP 端口 - `src/worker.main.ts:70-81`:启动时输出队列配置 - `src/worker.main.ts:88-101`:SIGTERM/SIGINT → `app.close()` → exit(0);异常 → exit(1) - `package.json:15`:`"start:worker": "node dist/worker.main"` ### 测试情况 - 已运行命令: - `npx tsc --noEmit` - `npx jest --no-coverage` - 结果: - TypeScript 编译:通过(0 新增错误) - 单元测试:283/283 全部通过,12 suites 全部通过 ### 未完成 / 风险 - Worker 启动校验无法在单元测试中验证(需要真实 MySQL/Redis),集成测试在 M-AI-01-08 中覆盖 ### 是否建议进入 Review - 是
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: wangdl/api-server#249
No description provided.