3.3 KiB
3.3 KiB
移除数据库,纯内存任务表 + 串行生成队列(无恢复功能,无鉴权)
确认结论:不做"恢复进行中任务"则数据库无不可替代用途 —— 轮询用进程内任务表,历史记录功能不存在,重启时任务本来就会死(数据库只是把提示从"任务中断"换成"生成失败")。多用户并发使用单后端实例不受影响。
A. 新增 server/services/tasks.py — 内存任务注册表
@dataclass TaskImage(type_id/name/status/url/error)@dataclass Task:id、status(pending|running|done|partial|failed)、platform/lang/ratio、style_set、style_prompt、requirements、provider、model、total、images、error,以及执行参数 context/plan/ref_images- 模块级
_TASKS: dict[str, Task];asyncio 单事件循环内读写,无并发问题 total语义保持:计划总张数;images逐张追加(前端进度 x/y 依赖)
B. 改造 server/services/generator.py
run_suite(task: Task)接收内存任务,不再查库;每张生成后task.images.append(...);storage.write_bytes(文件系统)不动- 串行生成队列:模块级
asyncio.Lock,拿锁后才置 running;多用户同时提交时后续任务保持 pending(前端已显示"排队中"),避免共享 API key 触发 rightapi 同 key 分钟级冷却 - 删除:商品路径分支(product 加载、
_select_ref_images)、SuiteImage/Suite 读写、fail_stale_suites(重启后内存为空,轮询自然 404,前端已有"任务已中断"提示)
C. 改造 server/api/generate.py
POST /api/generate:原 Suite 构建逻辑(texts_to_raw、plan 展开、ref_images 排序、模型路由校验)平移到 Task 对象,存入_TASKS,background.add_task(run_suite, task)POST /api/plan不动(本就不碰数据库)
D. 改造 server/api/suites.py
- 保留
GET /api/suites/{id}(读内存,不存在 404「任务不存在(服务可能已重启)」)、GET /api/suites/{id}/zip(从 Task.images 打包成功图) - 删除两个商品挂载端点
E. 删除文件与依赖
- 删除:
server/db.py、server/models.py(4 张表)、server/api/collection.py、server/api/products.py server/main.py:去掉 lifespan/init_db/fail_stale_suites 与对应路由server/schemas.py:删除商品路径与 materials 类型(SuiteCreateRequest、MaterialsRequest/Response、ProductOut/AssetOut/ProductListOut);保留 TextMaterial、GenerateRequest、SuiteOut 契约(前端零改动)server/requirements.txt:删sqlalchemy[asyncio]、aiosqlite- 前端
client.ts:删除 materials 死代码(buildMaterialsPayload/uploadMaterials 及类型)
F. README
架构说明更新:进程内任务表、重启即新会话(进行中任务中断,前端有提示)、数据目录只剩 media/;标注接口暂无鉴权,公网暴露前需内网/反代白名单,登录鉴权后续版本补充;将来若需恢复任务/历史记录/多实例,再引入数据库(任务表结构简单,迁移成本低)
不改的部分
- 前端交互/UI、生图 provider、prompt 逻辑、
data/media/图片文件 data/app.db数据文件保留(不再被使用,可自行删除)
验证
py_compile后端改动文件;tsc --noEmit+ 前端 build- 零成本链路测试(count=0 的 plan,不实际生图):提交 → 轮询 done/0 张 → 不存在的 id 返回 404
start.command重启,health 正常