Files
crawler-plugin/docs/plans/00-plan-overview.md
T
huangzd1997 42bbf4904e
Build Backend JAR / build (push) Has been cancelled
feat-admin-ui-interaction
2026-08-30 22:09:22 +08:00

175 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# crawler-plugin 性能与资源优化 Plan 总览
> 生成时间:2026-08-29T14:02:50+08:00Asia/Shanghai
> 适用仓库:`D:/todesk/副业/数富AI/crawler-plugin`
> 当前基线:HEAD `3229056`2026-08-29),本计划来源为代码审计;仓库当前不存在 `docs/specs/`,因此本文件先作为现状优化计划总览。
## 1. 计划说明
本计划针对大数据量、多图片、多任务并发场景,覆盖 Java 主后端、Python 插件后端、Vue 前端以及数据库/Redis/RustFS/RocketMQ 资源链路。
每个任务按约 8-15 分钟设计,开发时必须严格执行以下 TDD 顺序:
1. 先编写该任务全部测试;
2. 运行测试确认 RED
3. 实现功能并运行测试确认 GREEN;
4. 执行 lint/format、定向测试和必要的集成验证;
5. 任务独立提交 commit 后,才能开始下一个任务。
涉及 I/O、数据库、HTTP、RustFS、Redis、文件或外部服务的任务,必须包含 mock 单元测试和至少一个真实集成/启动调用验证。每个普通功能任务在对应模块计划中至少列出 8 个语义化测试用例:正常路径 3 个、边界 3 个、异常/错误 2 个。
## 2. 已验证基线
- `backend-java``mvn -q -DskipTests compile` 通过。
- `backend-java``mvn -q test`,54 个测试类、344 项测试,0 失败。
- `frontend-vue``npm run build` 通过;仍有公共 chunk 超过 500KB 的构建警告。
- `backend``python -m unittest discover -s tests -p "test*.py"`13 项测试通过。
- 当前没有生产压测、JFR、数据库 EXPLAIN 和真实 RustFS/Coze 指标,因此计划中的性能收益必须通过后续基准和压测确认。
## 3. 模块与任务范围
| 模块编号 | 模块 | 任务范围 | 任务数 |
|---|---|---:|---:|
| 01 | Similar ASIN 性能与资源优化 | 1-20 | 20 |
| 02 | 店铺数据抓取性能与累计文件优化 | 21-40 | 20 |
| 03 | 采集数据批处理与结果文件优化 | 41-60 | 20 |
| 04 | 共享任务、对象存储、调度与清理优化 | 61-80 | 20 |
| 05 | 前端轮询、缓存、构建与交付验收 | 81-100 | 20 |
模块计划文件将在本总览确认后按模块单独生成,不合并不同模块;每个模块文件将补充详细功能要求、完整测试清单、TDD RED/GREEN 流程和验证命令。
## 4. 全部任务清单
| N | 功能点 | 模块 | 依赖 | 预估耗时 |
|---:|---|---|---|---|
| 1 | 建立 Similar ASIN 性能基线夹具:1000/5000 行、图片开关、chunk 数与 payload 大小采样 | Similar ASIN 性能与资源优化 | 无 | 8-15 分钟 |
| 2 | 将解析载荷改为单一规范行集合,消除 items/groups/allItems 重复数据结构 | Similar ASIN 性能与资源优化 | 1 | 8-15 分钟 |
| 3 | 保留旧 payload 读取兼容逻辑,并验证新旧结构均可恢复全量行 | Similar ASIN 性能与资源优化 | 2 | 8-15 分钟 |
| 4 | 解析接口改为只返回固定数量预览行,完整行仅保存在后端任务载荷 | Similar ASIN 性能与资源优化 | 3 | 8-15 分钟 |
| 5 | 为预览行数量增加配置边界、空文件和超限输入校验 | Similar ASIN 性能与资源优化 | 4 | 8-15 分钟 |
| 6 | 将分组数据改为索引/范围引用,避免 groups 嵌套复制完整行对象 | Similar ASIN 性能与资源优化 | 5 | 8-15 分钟 |
| 7 | 限制单文件大小、最大行数和最大字段长度,防止解析任务无界增长 | Similar ASIN 性能与资源优化 | 6 | 8-15 分钟 |
| 8 | 将 WorkbookFactory 输入解析改为受控读取,并验证超大 Excel 的失败提示 | Similar ASIN 性能与资源优化 | 7 | 8-15 分钟 |
| 9 | 将 chunk 查询从单行分页改为批量 keyset 分页,保持低内存读取 | Similar ASIN 性能与资源优化 | 8 | 8-15 分钟 |
| 10 | 为 chunk 结果建立按 row key 的批量索引,消除跨 chunk 线性扫描 | Similar ASIN 性能与资源优化 | 9 | 8-15 分钟 |
| 11 | 将 Coze 结果合并的重复检测从 O(n²) 改为 HashSet/稳定 row key | Similar ASIN 性能与资源优化 | 10 | 8-15 分钟 |
| 12 | 扩展 Coze 结果缓冲覆盖范围,减少频繁读写完整 chunk payload | Similar ASIN 性能与资源优化 | 11 | 8-15 分钟 |
| 13 | 为 chunk 合并增加单次最大行数与 payload 字节上限 | Similar ASIN 性能与资源优化 | 12 | 8-15 分钟 |
| 14 | 图片 DB cache 改为批量读取缩略图,并只更新实际命中的 last_used_at | Similar ASIN 性能与资源优化 | 13 | 8-15 分钟 |
| 15 | 将图片缓存访问时间更新改为异步批量刷新,减少逐图 UPDATE | Similar ASIN 性能与资源优化 | 14 | 8-15 分钟 |
| 16 | 图片预取改为短预算 best-effort,超时后直接回退 URL | Similar ASIN 性能与资源优化 | 15 | 8-15 分钟 |
| 17 | 优化图片解码采样、像素上限和 JPEG 质量搜索,降低 CPU 与堆峰值 | Similar ASIN 性能与资源优化 | 16 | 8-15 分钟 |
| 18 | 统一图片 spool 生命周期,确保超时、取消和异常路径删除临时文件 | Similar ASIN 性能与资源优化 | 17 | 8-15 分钟 |
| 19 | 将 Coze 请求/响应及 Python 回传日志改为采样、截断和 DEBUG 级别 | Similar ASIN 性能与资源优化 | 18 | 8-15 分钟 |
| 20 | 完成 Similar ASIN 端到端压测、JFR/GC 分析与结果文件兼容回归 | Similar ASIN 性能与资源优化 | 19 | 8-15 分钟 |
| 21 | 建立店铺抓取性能基线:单店铺 1k/5k 行、多国家、图片成功/失败场景 | 店铺数据抓取性能与累计文件优化 | 无 | 8-15 分钟 |
| 22 | 将店铺 Excel 图片缓存替换为有界字节缓存 | 店铺数据抓取性能与累计文件优化 | 21 | 8-15 分钟 |
| 23 | 图片嵌入成功后立即释放外部缩略图字节副本 | 店铺数据抓取性能与累计文件优化 | 22 | 8-15 分钟 |
| 24 | 为店铺图片预取增加任务级数量、字节和超时上限 | 店铺数据抓取性能与累计文件优化 | 23 | 8-15 分钟 |
| 25 | 评估并实现店铺结果 workbook 的 SXSSF 或 spool 化写入路径 | 店铺数据抓取性能与累计文件优化 | 24 | 8-15 分钟 |
| 26 | 为模板 workbook 增加大行数下的样式、图片和工作表兼容测试 | 店铺数据抓取性能与累计文件优化 | 25 | 8-15 分钟 |
| 27 | 将 chunk 接收改为原子插入/幂等 upsert,减少先查后插 | 店铺数据抓取性能与累计文件优化 | 26 | 8-15 分钟 |
| 28 | 以 scope 计数器替代每个 chunk 的 COUNT(*) 完整统计 | 店铺数据抓取性能与累计文件优化 | 27 | 8-15 分钟 |
| 29 | 合并 scope 状态查询与更新,减少单 chunk 数据库往返 | 店铺数据抓取性能与累计文件优化 | 28 | 8-15 分钟 |
| 30 | 为国家结果行建立稳定去重键,替换线性重复扫描 | 店铺数据抓取性能与累计文件优化 | 29 | 8-15 分钟 |
| 31 | 将任务快照改为轻量进度字段,避免每次写入完整结果 JSON | 店铺数据抓取性能与累计文件优化 | 30 | 8-15 分钟 |
| 32 | 将 task entity 本地缓存替换为有容量和过期回收的实现 | 店铺数据抓取性能与累计文件优化 | 31 | 8-15 分钟 |
| 33 | 将店铺源文件 key 映射改为确定路径,取消临时目录递归扫描 | 店铺数据抓取性能与累计文件优化 | 32 | 8-15 分钟 |
| 34 | 将 ownerInstanceId 从 JSON 查询迁移到显式列并补充索引 | 店铺数据抓取性能与累计文件优化 | 33 | 8-15 分钟 |
| 35 | 将每日累计文件改为数据层增量模型,避免每次下载并重写完整 XLSX | 店铺数据抓取性能与累计文件优化 | 34 | 8-15 分钟 |
| 36 | 为每日累计文件引入版本号/CAS,缩短店铺级锁的持有时间 | 店铺数据抓取性能与累计文件优化 | 35 | 8-15 分钟 |
| 37 | 拆分每日累计文件组装与任务结果接收,增加异步文件作业状态 | 店铺数据抓取性能与累计文件优化 | 36 | 8-15 分钟 |
| 38 | 历史列表与进度查询增加分页、字段裁剪和批量任务加载 | 店铺数据抓取性能与累计文件优化 | 37 | 8-15 分钟 |
| 39 | 补充删除、超时、重复回传和累计文件失败的资源清理测试 | 店铺数据抓取性能与累计文件优化 | 38 | 8-15 分钟 |
| 40 | 完成店铺抓取压测并比较内存、CPU、DB QPS、对象存储流量和锁等待 | 店铺数据抓取性能与累计文件优化 | 39 | 8-15 分钟 |
| 41 | 建立 Collect Data 1k/10k 行、多个 chunk 和品牌检测场景基线 | 采集数据批处理与结果文件优化 | 无 | 8-15 分钟 |
| 42 | 限制采集解析的文件大小、最大行数和单 chunk 行数 | 采集数据批处理与结果文件优化 | 41 | 8-15 分钟 |
| 43 | 将采集源文件查找改为确定路径/索引查询 | 采集数据批处理与结果文件优化 | 42 | 8-15 分钟 |
| 44 | 保留原始 chunk payload 的同时,减少逐行 extra JSON 的重复序列化 | 采集数据批处理与结果文件优化 | 43 | 8-15 分钟 |
| 45 | 将 ASIN 去重查询与无效品牌查询统一为批量集合查询 | 采集数据批处理与结果文件优化 | 44 | 8-15 分钟 |
| 46 | 跳过空品牌批次的无效远程品牌检查请求 | 采集数据批处理与结果文件优化 | 45 | 8-15 分钟 |
| 47 | 为品牌检查结果增加任务内短期缓存,避免同品牌重复远程调用 | 采集数据批处理与结果文件优化 | 46 | 8-15 分钟 |
| 48 | 将 invalid ASIN 记录改为批量 INSERT IGNORE/upsert | 采集数据批处理与结果文件优化 | 47 | 8-15 分钟 |
| 49 | 将结果明细从逐行 RustFS 对象改为 chunk 级 payload 存储 | 采集数据批处理与结果文件优化 | 48 | 8-15 分钟 |
| 50 | 为结果明细设计批量 upsert mapper 与幂等唯一键 | 采集数据批处理与结果文件优化 | 49 | 8-15 分钟 |
| 51 | 将 accepted 行的序列化和 hash 计算改为批量处理 | 采集数据批处理与结果文件优化 | 50 | 8-15 分钟 |
| 52 | 生成结果文件时按 chunk 一次读取,取消逐行对象读取 | 采集数据批处理与结果文件优化 | 51 | 8-15 分钟 |
| 53 | 将 rawRows 与 finalRows 的内存生命周期分段,避免同时长期驻留 | 采集数据批处理与结果文件优化 | 52 | 8-15 分钟 |
| 54 | 将 finalRowCount 从每个 chunk COUNT(*) 改为任务内增量计数 | 采集数据批处理与结果文件优化 | 53 | 8-15 分钟 |
| 55 | 将进度统计更新改为节流/合并写,减少高频 task UPDATE | 采集数据批处理与结果文件优化 | 54 | 8-15 分钟 |
| 56 | 为采集结果文件增加流式写入失败后的临时文件清理 | 采集数据批处理与结果文件优化 | 55 | 8-15 分钟 |
| 57 | 为采集结果对象增加数据库删除与物理对象删除的一致性处理 | 采集数据批处理与结果文件优化 | 56 | 8-15 分钟 |
| 58 | 补充外部品牌服务不可用、RustFS 超时和重复 chunk 的降级测试 | 采集数据批处理与结果文件优化 | 57 | 8-15 分钟 |
| 59 | 完成采集模块数据库索引、批量 SQL 和对象存储调用次数验证 | 采集数据批处理与结果文件优化 | 58 | 8-15 分钟 |
| 60 | 完成采集模块 10k 行压测并验收结果完整性、内存和吞吐 | 采集数据批处理与结果文件优化 | 59 | 8-15 分钟 |
| 61 | 建立共享任务链路资源指标基线:线程、连接、队列、GC、Redis、RustFS 和 DB | 共享任务、对象存储、调度与清理优化 | 无 | 8-15 分钟 |
| 62 | 为本地任务实体缓存增加最大条目数、TTL 和定时清理 | 共享任务、对象存储、调度与清理优化 | 61 | 8-15 分钟 |
| 63 | 为前端/后端进度快照增加写入去重和最小更新间隔 | 共享任务、对象存储、调度与清理优化 | 62 | 8-15 分钟 |
| 64 | 将 transient payload 压缩改为直接 gzip 二进制流上传 | 共享任务、对象存储、调度与清理优化 | 63 | 8-15 分钟 |
| 65 | 为 transient payload 读取增加流式解压和解压后字节上限 | 共享任务、对象存储、调度与清理优化 | 64 | 8-15 分钟 |
| 66 | 限制 RustFS 并发读写与重试的总资源预算,防止多任务叠加爆发 | 共享任务、对象存储、调度与清理优化 | 65 | 8-15 分钟 |
| 67 | 复用 RustFS/MinIO 客户端与 HTTP 连接池,减少每次操作创建客户端 | 共享任务、对象存储、调度与清理优化 | 66 | 8-15 分钟 |
| 68 | 将 payload 引用删除改为批量引用检查与异步物理删除 | 共享任务、对象存储、调度与清理优化 | 67 | 8-15 分钟 |
| 69 | 为数据库删除任务补充 transient payload 指针收集和清理队列 | 共享任务、对象存储、调度与清理优化 | 68 | 8-15 分钟 |
| 70 | 将历史清理改为 keyset 分页、小批量和短事务 | 共享任务、对象存储、调度与清理优化 | 69 | 8-15 分钟 |
| 71 | 清理日志改为数量与 sample ID,禁止输出超长任务 ID 列表 | 共享任务、对象存储、调度与清理优化 | 70 | 8-15 分钟 |
| 72 | 为文件作业实现数据库原子 claim,避免重复派发同一 job | 共享任务、对象存储、调度与清理优化 | 71 | 8-15 分钟 |
| 73 | 为本地文件作业队列增加 in-flight 去重和队列背压 | 共享任务、对象存储、调度与清理优化 | 72 | 8-15 分钟 |
| 74 | 隔离调度线程池、文件作业线程池和外部 Coze/图片执行池 | 共享任务、对象存储、调度与清理优化 | 73 | 8-15 分钟 |
| 75 | 为虚拟线程任务增加等待队列上限与拒绝/延迟指标 | 共享任务、对象存储、调度与清理优化 | 74 | 8-15 分钟 |
| 76 | 将 JSON owner 查询迁移到显式列并补充任务/状态复合索引 | 共享任务、对象存储、调度与清理优化 | 75 | 8-15 分钟 |
| 77 | 统一 Coze、品牌检查和紫鸟 HTTP 客户端的连接复用策略 | 共享任务、对象存储、调度与清理优化 | 76 | 8-15 分钟 |
| 78 | 为所有外部调用增加耗时、重试、失败率和 payload 字节指标 | 共享任务、对象存储、调度与清理优化 | 77 | 8-15 分钟 |
| 79 | 为对象存储、数据库和队列增加故障注入测试 | 共享任务、对象存储、调度与清理优化 | 78 | 8-15 分钟 |
| 80 | 补充 JVM 堆、直接内存、临时磁盘和连接池容量配置说明 | 共享任务、对象存储、调度与清理优化 | 79 | 8-15 分钟 |
| 81 | 建立前端任务轮询请求量、响应体大小和页面内存基线 | 前端轮询、缓存、构建与交付验收 | 无 | 8-15 分钟 |
| 82 | 为进度响应 Map 增加 TTL 清理与最大条目数 | 前端轮询、缓存、构建与交付验收 | 81 | 8-15 分钟 |
| 83 | 统一不同页面的轮询去重、in-flight 合并和终态清理 | 前端轮询、缓存、构建与交付验收 | 82 | 8-15 分钟 |
| 84 | 优化店铺抓取队列状态合并,消除 historyItems 的线性重复查找 | 前端轮询、缓存、构建与交付验收 | 83 | 8-15 分钟 |
| 85 | 优化 Similar ASIN 轮询与文件生成等待,避免重复 force 请求 | 前端轮询、缓存、构建与交付验收 | 84 | 8-15 分钟 |
| 86 | 将隐藏页面轮询间隔、前台恢复和退避策略统一配置化 | 前端轮询、缓存、构建与交付验收 | 85 | 8-15 分钟 |
| 87 | 限制 localStorage 中任务、快照和队列数据的最大数量/字节数 | 前端轮询、缓存、构建与交付验收 | 86 | 8-15 分钟 |
| 88 | 解析结果前端只接收预览数据,避免大 payload 进入响应式对象 | 前端轮询、缓存、构建与交付验收 | 87 | 8-15 分钟 |
| 89 | 清理页面卸载时的所有 timer、请求和临时 URL | 前端轮询、缓存、构建与交付验收 | 88 | 8-15 分钟 |
| 90 | 为进度接口增加断网、超时、服务恢复和重复响应测试 | 前端轮询、缓存、构建与交付验收 | 89 | 8-15 分钟 |
| 91 | 按页面拆分 Element Plus 与公共业务 chunk | 前端轮询、缓存、构建与交付验收 | 90 | 8-15 分钟 |
| 92 | 配置 Vite manualChunks 并比较各页面首屏传输大小 | 前端轮询、缓存、构建与交付验收 | 91 | 8-15 分钟 |
| 93 | 补充 Similar ASIN、店铺抓取和采集数据页面的 E2E 核心路径 | 前端轮询、缓存、构建与交付验收 | 92 | 8-15 分钟 |
| 94 | 补充移动端与桌面端响应式页面验收截图 | 前端轮询、缓存、构建与交付验收 | 93 | 8-15 分钟 |
| 95 | 补充深色主题、错误提示、重试和终态刷新验收 | 前端轮询、缓存、构建与交付验收 | 94 | 8-15 分钟 |
| 96 | 建立 Java/Python/Vue 三端统一的 API 字段兼容检查 | 前端轮询、缓存、构建与交付验收 | 95 | 8-15 分钟 |
| 97 | 执行 Java 全量测试、Python unittest、Vue 类型检查与构建 | 前端轮询、缓存、构建与交付验收 | 96 | 8-15 分钟 |
| 98 | 执行真实启动、健康检查、核心请求和外部依赖调用验证 | 前端轮询、缓存、构建与交付验收 | 97 | 8-15 分钟 |
| 99 | 执行全链路压测并记录 CPU、内存、GC、DB、Redis、RustFS、网络结果 | 前端轮询、缓存、构建与交付验收 | 98 | 8-15 分钟 |
| 100 | 完成发布前回滚演练、git commit 对应关系检查和交付清单 | 前端轮询、缓存、构建与交付验收 | 99 | 8-15 分钟 |
## 5. 收尾硬性 Gate
以下验证不是可选项,任一失败都不能视为计划完成:
1. 使用项目实际启动命令启动 Java 服务,并通过健康检查端点。
2. 启动 Python 后端并确认核心管理入口可访问。
3. 访问 Similar ASIN、店铺数据抓取和采集数据页面,确认关键元素存在。
4. 使用真实最小文件完成一次解析、任务创建、任务执行和结果下载。
5. 使用多样化输入验证关键业务逻辑不是固定模板或纯回显。
6. 验证数据库、Redis、RustFS、RocketMQ 和外部 HTTP 服务确实发生调用。
7. 验证非法输入、依赖不可用、超时、断网和重复回传有明确错误或降级行为。
8. 验证任务取消、页面关闭、服务重启和 owner 路由后不会残留锁、线程、timer 或临时文件。
9. Java 全量测试全绿。
10. Python 测试全绿。
11. Vue 类型检查和生产构建通过。
12. Java、Python 和前端 lint/format 检查零错误。
13. Playwright 完成桌面端页面可访问和关键交互路径验证。
14. Playwright 验证断网、恢复、错误提示和重试行为。
15. 页面主题切换行为符合预期(如项目页面支持主题)。
16. 保存 Desktop 1280x800 与 Mobile 375x812 响应式验收截图。
17. 执行 Java、Python、Vue 三端接口字段一致性检查。
18. 执行 `git log` 检查 1-100 每个任务均有对应 commit。
19. 最后执行 `python check_progress.py`,仅当输出 `all tasks done` 且退出码为 0 时才宣布计划完成。
## 6. 当前阶段
当前已生成本 `00-plan-overview.md`、5 个模块详细 plan 文件及根目录 `progress.json`;各任务状态全部为 `pending`。详细 plan 已按模块拆分,完成全部任务后执行收尾 Gate 并进入 Step 3。
总任务数:100