## Context 现有配置表保存短任务类型,Worker 使用 `polling:` 作为当前计数键;配置缓存仍使用短类型。当前数据缺少两个已运行的任务、保留一个无执行器任务,且管理服务的展示名称匹配了错误的完整任务类型。详见 proposal.md 与轮询运营 delta spec。 ## Goals / Non-Goals **Goals:** - 让数据库配置、Redis 缓存与五个 Worker 任务类型保持一致。 - 保持 `protect` 与 `card_status` 当前回退生效的 300 上限不变。 - 在共享释放点消除负信号量。 **Non-Goals:** - 不调整既有 `realname`、`carddata`、`package` 的最大并发数。 - 不依据资产数量自动计算或提高并发,也不更改队列、Worker 数量或第三方请求策略。 - 不修改历史迁移。 ## Decisions ### 以数据迁移校正配置集合 新增成对迁移使用幂等插入补齐 `protect`、`card_status`,初始值均为 300;删除 `stop_start`。300 是两类任务当前 Redis 配置缺失时 Worker 已采用的回退值,迁移后可观测、可维护而不改变即时压力。回滚恢复遗留 `stop_start` 的默认记录并移除两项新增记录。 备选方案是把两项直接设为 5000;这会把实际请求上限从当前回退值提高,超出本次配置一致性修复范围。 ### 以短任务类型作为管理面唯一标识 管理配置表、路由参数与 Redis 配置缓存继续使用短类型;仅当前占用计数键在服务内部转换为完整任务类型。名称映射按短类型覆盖全部五项,避免接口将内部键回显给运营者。 ### 释放脚本钳制最小值 共享 `releaseConcurrency` 改用 Lua 原子操作:仅当当前值大于零时递减,否则将计数保持或归零。这样重置、TTL 到期与重复释放均不会产生负数,且不需在每个 Handler 添加分支。 ### 移除无效上限校验 最大并发仍必须为正整数,移除与已有 5000 配置冲突的 1000 上限。数据库的整数类型继续承担存储边界;本变更不引入新的容量策略。 ## Risks / Trade-offs - [回滚无法保留历史 `stop_start` 的人工修改值] → 该任务没有执行器,回滚仅恢复默认遗留记录;上线前记录现有值。 - [Redis 中可能残留 `stop_start` 缓存键] → 部署初始化仅同步有效数据库配置;实施时显式删除该遗留缓存键。 - [释放与获取并发] → 释放脚本是单键原子操作,不改变获取脚本或任务重入队语义。 ## Migration Plan 1. 发布包含新迁移与服务/Worker 修复的版本。 2. 执行迁移,补齐两项 300 配置并删除 `stop_start`。 3. 服务启动同步五项配置到 Redis,并清理遗留 `stop_start` 缓存键。 4. 通过管理接口确认五项任务、中文名称和非负计数;在重置后完成一个运行中任务,确认计数不低于零。 5. 若必须回滚,先停止新版本,再执行 down migration,恢复旧版本并重新同步其配置缓存。