feat(jobs): 增加后台任务运行时

This commit is contained in:
2026-07-08 17:02:51 +08:00
parent 69f50ea1f5
commit ba999c9322
14 changed files with 575 additions and 2 deletions

View File

@@ -578,3 +578,17 @@
- 分区键进入每次领域写入,能维持 V2.2 分区表设计的查询边界。
- AppData fallback 让迁移可回滚、可兼容旧数据,但不再制造长期双事实源。
- RBAC/配置表会影响权限模型和管理流程单独成阶段更安全V2.4.5 只收口当前高频业务写入,避免为了“全收口”临时设计不稳的权限 schema。
## 45. V2.6 后台任务先采用 PostgreSQL Lease 队列
**问题**小宝风险摘要、AI 解读和后续通知都需要在用户不打开页面时后台刷新。直接把这些逻辑放在页面 effect 中会导致无人访问时数据不更新;直接引入 Redis queue 又会增加一套可靠性、幂等和迁移运维面。
**决策**
- 新增 `background_jobs` 表和 `JobsModule`,作为 V2.6 后台任务运行时。
- Job 行包含 `type``payload``dedupe_key``status``attempts``max_attempts``available_at``locked_by``locked_until``last_error`
- 同一 `type + dedupe_key``queued/running` 状态下唯一;服务层先查 active job遇到并发唯一冲突再回读保证 enqueue 幂等。
- Worker claim 使用数据库事务、`FOR UPDATE SKIP LOCKED` 和 lease 时间;`running``locked_until` 过期的 job 可以被新 worker 回收。
- Handler 失败时按 `attempts < max_attempts` 重回 `queued` 并设置下一次 `available_at`;达到上限后进入 `failed`,只记录错误,不修改业务实体。
- `BackgroundJobWorker` 只负责 handler 注册和单次执行,业务副作用仍放在各领域 service 内,避免队列层知道小宝、通知或审计细节。
**理由**PostgreSQL 队列足够支撑 V2.6 的低频后台刷新,同时能和领域写入共享事务边界、唯一约束和迁移流程。等 V2.7 通知或更高吞吐任务落地后,如确实需要 Redis/专用队列,再通过同一 `JobsService` 接口替换底层实现,而不是现在提前引入第二套事实源。