[M-AI-03] 审计现有 Job 创建、Worker 执行与 Outbox 接入边界 #284

Closed
opened 2026-06-20 16:43:10 +08:00 by wangdl · 2 comments
Owner

类型 / 标签

  • audit
  • architecture
  • backend
  • queue

风险等级

P1

目标

在实现统一 Engine 前,确认现有生产代码中所有 Job 创建、状态更新、Queue Producer、Worker、Provider 和结果写入路径。

审计范围

至少搜索:

  • prisma.aiJob
  • QueueService.add
  • @Processor
  • AiGatewayService
  • AiAnalysisWorker
  • DocumentImportWorker
  • EventBusService
  • OutboxRepository
  • AiJobSnapshotRepository
  • AiJobArtifactRepository
  • lifecycleStatus 写入
  • legacy status 写入
  • BullMQ jobId
  • retry/backoff
  • timeout
  • cancellation

必须输出

Job Producer 矩阵

Producer Controller/Subscriber DB Job Queue Payload 当前状态写入

Worker 矩阵

Worker Queue Handler Provider 结果表 事件

Outbox 现状

  • 当前是否有生产写入;
  • 当前是否有 Dispatcher;
  • Repository 方法是否满足并发领取;
  • 是否支持 MySQL 8 SKIP LOCKED
  • 是否存在重复发布风险。

依赖边界

明确:

  • 哪些旧代码必须保持;
  • 哪些新模块可以独立新增;
  • 哪些 Module 只能在 WorkerModule;
  • 哪些 Module 同时需要 API 和 Worker;
  • 是否存在循环依赖风险。

非目标

  • 不修改代码;
  • 不修改 Prisma;
  • 不创建队列;
  • 不实现 Engine。

输出

docs/architecture/m-ai-03-current-execution-audit.md

所有结论附文件、类、方法和行号。

验收标准

  • Job Producer 矩阵完整,覆盖所有现有 Job 创建点
  • Worker 矩阵完整,覆盖所有现有 Worker 和处理器
  • Outbox 现状评估完成,含并发领取和幂等性分析
  • 依赖边界明确,标注循环依赖风险点
  • 审计文档输出到 docs/architecture/m-ai-03-current-execution-audit.md
  • 所有结论附文件、类、方法和行号
## 类型 / 标签 - audit - architecture - backend - queue ## 风险等级 P1 ## 目标 在实现统一 Engine 前,确认现有生产代码中所有 Job 创建、状态更新、Queue Producer、Worker、Provider 和结果写入路径。 ## 审计范围 至少搜索: - `prisma.aiJob` - `QueueService.add` - `@Processor` - `AiGatewayService` - `AiAnalysisWorker` - `DocumentImportWorker` - `EventBusService` - `OutboxRepository` - `AiJobSnapshotRepository` - `AiJobArtifactRepository` - lifecycleStatus 写入 - legacy status 写入 - BullMQ jobId - retry/backoff - timeout - cancellation ## 必须输出 ### Job Producer 矩阵 | Producer | Controller/Subscriber | DB Job | Queue | Payload | 当前状态写入 | | -------- | --------------------- | ------ | ----- | ------- | ------ | ### Worker 矩阵 | Worker | Queue | Handler | Provider | 结果表 | 事件 | | ------ | ----- | ------- | -------- | --- | -- | ### Outbox 现状 - 当前是否有生产写入; - 当前是否有 Dispatcher; - Repository 方法是否满足并发领取; - 是否支持 MySQL 8 `SKIP LOCKED`; - 是否存在重复发布风险。 ### 依赖边界 明确: - 哪些旧代码必须保持; - 哪些新模块可以独立新增; - 哪些 Module 只能在 WorkerModule; - 哪些 Module 同时需要 API 和 Worker; - 是否存在循环依赖风险。 ## 非目标 - 不修改代码; - 不修改 Prisma; - 不创建队列; - 不实现 Engine。 ## 输出 ``` docs/architecture/m-ai-03-current-execution-audit.md ``` 所有结论附文件、类、方法和行号。 ## 验收标准 - [ ] Job Producer 矩阵完整,覆盖所有现有 Job 创建点 - [ ] Worker 矩阵完整,覆盖所有现有 Worker 和处理器 - [ ] Outbox 现状评估完成,含并发领取和幂等性分析 - [ ] 依赖边界明确,标注循环依赖风险点 - [ ] 审计文档输出到 `docs/architecture/m-ai-03-current-execution-audit.md` - [ ] 所有结论附文件、类、方法和行号
wangdl added this to the M-AI-03 统一 Job Engine、Registry 与 Outbox milestone 2026-06-20 16:44:53 +08:00
Author
Owner

开发完成评论

完成内容

  • 审计了全部 Job 创建点(10 个 Producer),覆盖 AiAnalysis、DocumentImport、KnowledgeSource、UserAi、EventBus、Notifications、AdminFiles
  • 审计了全部 Worker/Processor(5 个):AiAnalysisWorker、DocumentImportWorker、NotificationWorker、AuditLogProcessor、FileCleanupProcessor
  • 审计了 AiRuntimeJob 完整 REST Poll 链路(poll→lock→heartbeat→snapshot→credential→submit→persist→failure→cancel)
  • 审计了 AiGatewayService 的统一 Provider 路由、重试/降级/安全/计费/事件发布路径
  • 审计了 OutboxRepository 现状:表就绪,Repository 完整,但无生产者调用、无 Dispatcher
  • 审计了 6 个 BullMQ 队列的配置(concurrency=1, lockDuration=30s, attempts=3, backoff=exponential)
  • 审计了 EventBus 使用情况:13 个事件全部 sync 发布,publishAsync 未使用
  • 明确了依赖边界:仅 WorkerModule 的模块、API+Worker 共用的模块、仅 AppModule 的模块
  • 标注了循环依赖(EventBus↔Queue forwardRef)和 M-AI-03 关键风险

修改文件

  • docs/architecture/m-ai-03-current-execution-audit.md(新增,441 行)

代码证据

  • Producer:src/modules/ai-analysis/ai-analysis.service.ts:19-31, 40-51
  • Producer:src/modules/document-import/document-import.service.ts:43-49
  • Producer:src/modules/knowledge-source/knowledge-source.service.ts:44-50, 91-97
  • Producer:src/modules/ai-runtime/user-ai.service.ts:282-299
  • Worker:src/workers/ai-analysis.worker.ts:18-106
  • Worker:src/workers/document-import.worker.ts:11-92
  • Outbox:src/infrastructure/outbox/outbox.repository.ts:27-139(零调用方)
  • Queue Definitions:src/infrastructure/queue/queue-definitions.ts:94-101
  • AiGateway:src/modules/ai/gateway/ai-gateway.service.ts:25-271
  • Runtime Internal:src/modules/ai-runtime/internal/runtime-internal.service.ts:1-695
  • Job Reaper:src/modules/ai-runtime/job-reaper.service.ts:24-115
  • EventBus:src/common/event-bus/event-bus.service.ts:10-37
  • Module 组织:src/app.module.ts, src/worker.module.ts

测试情况

  • 本 Issue 为纯审计,不涉及代码修改,无需运行测试

未完成 / 风险

  • Outbox 无 Dispatcher — 将进入 M-AI-03-07
  • AiJob 创建与入队非原子 — 将进入 M-AI-03-06
  • RuntimeInternalService.submitResult() 中 result create 与 job update 非原子 — M-AI-03 暂不覆盖 AiRuntimeJob

是否建议进入 Review

  • 是 — 建议审查审计文档完整性后进入 #285(冻结 ADR)
## 开发完成评论 ### 完成内容 - 审计了全部 Job 创建点(10 个 Producer),覆盖 AiAnalysis、DocumentImport、KnowledgeSource、UserAi、EventBus、Notifications、AdminFiles - 审计了全部 Worker/Processor(5 个):AiAnalysisWorker、DocumentImportWorker、NotificationWorker、AuditLogProcessor、FileCleanupProcessor - 审计了 AiRuntimeJob 完整 REST Poll 链路(poll→lock→heartbeat→snapshot→credential→submit→persist→failure→cancel) - 审计了 AiGatewayService 的统一 Provider 路由、重试/降级/安全/计费/事件发布路径 - 审计了 OutboxRepository 现状:表就绪,Repository 完整,但无生产者调用、无 Dispatcher - 审计了 6 个 BullMQ 队列的配置(concurrency=1, lockDuration=30s, attempts=3, backoff=exponential) - 审计了 EventBus 使用情况:13 个事件全部 sync 发布,publishAsync 未使用 - 明确了依赖边界:仅 WorkerModule 的模块、API+Worker 共用的模块、仅 AppModule 的模块 - 标注了循环依赖(EventBus↔Queue forwardRef)和 M-AI-03 关键风险 ### 修改文件 - `docs/architecture/m-ai-03-current-execution-audit.md`(新增,441 行) ### 代码证据 - Producer:`src/modules/ai-analysis/ai-analysis.service.ts:19-31, 40-51` - Producer:`src/modules/document-import/document-import.service.ts:43-49` - Producer:`src/modules/knowledge-source/knowledge-source.service.ts:44-50, 91-97` - Producer:`src/modules/ai-runtime/user-ai.service.ts:282-299` - Worker:`src/workers/ai-analysis.worker.ts:18-106` - Worker:`src/workers/document-import.worker.ts:11-92` - Outbox:`src/infrastructure/outbox/outbox.repository.ts:27-139`(零调用方) - Queue Definitions:`src/infrastructure/queue/queue-definitions.ts:94-101` - AiGateway:`src/modules/ai/gateway/ai-gateway.service.ts:25-271` - Runtime Internal:`src/modules/ai-runtime/internal/runtime-internal.service.ts:1-695` - Job Reaper:`src/modules/ai-runtime/job-reaper.service.ts:24-115` - EventBus:`src/common/event-bus/event-bus.service.ts:10-37` - Module 组织:`src/app.module.ts`, `src/worker.module.ts` ### 测试情况 - 本 Issue 为纯审计,不涉及代码修改,无需运行测试 ### 未完成 / 风险 - Outbox 无 Dispatcher — 将进入 M-AI-03-07 - AiJob 创建与入队非原子 — 将进入 M-AI-03-06 - RuntimeInternalService.submitResult() 中 result create 与 job update 非原子 — M-AI-03 暂不覆盖 AiRuntimeJob ### 是否建议进入 Review - 是 — 建议审查审计文档完整性后进入 #285(冻结 ADR)
Author
Owner

修正记录 (2026-06-20)

已修正 4 个 Blocking 问题,commit ed78396

1. P7 死代码矛盾 — 已修正

  • publishAsync() 全文搜索确认零调用方,已从活跃 Producer 矩阵移除
  • 新增"死代码"节标注 domain-events 队列当前无活跃生产者

2. P8 NotificationsService.send() 事实错误 — 已修正

  • 代码确认 send()repository.create(data) + eventBus.publish(),无 queue.add()
  • 已从 Producer 矩阵移除
  • 新增"孤儿队列"节,标注 notification 队列 Consumer 存在但生产者未找到

3. P10 AdminEventsController 分类错误 — 已修正

  • 代码确认仅 getWaitingCount/getActiveCount/getFailed/getJob/job.retry() — 无 queue.add()
  • 已从 Producer 矩阵移除

4. 文档未提交 — 已修正

  • git add + git commit + git pushed78396
## 修正记录 (2026-06-20) 已修正 4 个 Blocking 问题,commit `ed78396`: ### 1. P7 死代码矛盾 — 已修正 - `publishAsync()` 全文搜索确认零调用方,已从活跃 Producer 矩阵移除 - 新增"死代码"节标注 `domain-events` 队列当前无活跃生产者 ### 2. P8 NotificationsService.send() 事实错误 — 已修正 - 代码确认 `send()` 仅 `repository.create(data)` + `eventBus.publish()`,无 `queue.add()` - 已从 Producer 矩阵移除 - 新增"孤儿队列"节,标注 `notification` 队列 Consumer 存在但生产者未找到 ### 3. P10 AdminEventsController 分类错误 — 已修正 - 代码确认仅 `getWaitingCount`/`getActiveCount`/`getFailed`/`getJob`/`job.retry()` — 无 `queue.add()` - 已从 Producer 矩阵移除 ### 4. 文档未提交 — 已修正 - `git add` + `git commit` + `git push` → `ed78396`
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#284
No description provided.