huangzd1997
|
cf83752338
|
task-132: /result 成功确认时机契约(四模块 200+success=true 必在落库后、失败不成功、重试安全)+ 8 条守门测试
|
2026-09-02 04:44:21 +08:00 |
|
huangzd1997
|
c60ad48be5
|
task-131: collectdata 事务收缩契约固化(/result 锁内单条写无长事务 + 响应 DTO 写后组装)+ 8 条守门测试
|
2026-09-02 04:37:14 +08:00 |
|
huangzd1997
|
29ddf5c780
|
task-130: publish 事务收缩契约固化(prepare 外置/短事务落库/提交后清理已符合 spec 07)+ 8 条守门测试
|
2026-09-02 04:25:14 +08:00 |
|
huangzd1997
|
5e71e1bb3d
|
task-129: shopdatacrawl 事务收缩(/result 无长事务契约固化 + deleteTask 纯计算抽静态纯函数)+ 8 条边界测试
|
2026-09-02 04:15:44 +08:00 |
|
huangzd1997
|
ecc62f095b
|
task-128: appearancepatent 事务收缩(flatten/序列化/存储/哈希纯计算抽 prepareSubmittedChunk 移出事务,双事务路径不变)+ 8 条边界测试
|
2026-09-02 03:54:29 +08:00 |
|
huangzd1997
|
28f61eb70d
|
task-127: similarasin 临时文件清理时机契约固化(提交后清理/回滚不清理/异常吞掉/可重试/幂等)+ 8 条守门测试
|
2026-09-02 03:44:38 +08:00 |
|
huangzd1997
|
ef4ea8d24b
|
task-126: similarasin DTO 组装位置契约固化(审计结论:/result 无响应 DTO、可移出组装已在事务外、落库行组装顺序不变)+ 8 条守门测试
|
2026-09-02 03:39:54 +08:00 |
|
huangzd1997
|
79b3efd365
|
task-125: similarasin /result 纯计算移出事务(payload 哈希在 prepare 阶段预计算,落库直接引用)+ 9 条事务边界守门测试
|
2026-09-02 03:34:15 +08:00 |
|
huangzd1997
|
56afee0386
|
task-124: @Transactional 方法审计清单(147 方法/30 模块扫描器 + 13 条测试 + 报告快照,不改生产代码)
|
2026-09-02 03:24:23 +08:00 |
|
huangzd1997
|
793bd4f9c8
|
task-123: 性能基准堆采样前先 GC,消除全量套件下残留垃圾导致的 1GB 边界 flaky
|
2026-09-02 03:20:44 +08:00 |
|
huangzd1997
|
445b7780c5
|
task-122: N+1 批量化修复(claim/stuck-reset/stale-check 逐行 selectById 改 selectBatchIds 批量回读 + Map 装配,行为等价)
|
2026-09-02 03:13:05 +08:00 |
|
huangzd1997
|
29625f703c
|
task-121: N+1 扫描审计(循环内单查扫描器 + 10 条测试 + 报告快照,不改生产代码)
|
2026-09-02 02:40:16 +08:00 |
|
huangzd1997
|
5f4fcad2ef
|
修复双实例 owner-scoped 结果文件 job 被非归属实例误杀
Build Backend JAR / build (push) Has been cancelled
线上现象:货源查询任务 26402/26400(归属 server-121)在归属机正常推进,
却被 server-110 判为「结果生成失败」,错误为「该任务已绑定到另一台服务实例处理」。
两个缺陷叠加:
1. 两台实例共用一个 RocketMQ consumer group,dispatch 消息被轮询投递;
worker 对"PENDING + owner 不匹配"的 job 选择本地抢跑,模块层
ensureTaskOwnedByCurrentInstance 直接抛 TaskOwnerMismatchException,
异常落进通用 catch 被当成生成失败,5 次抢跑即耗尽 retryCount 并终态失败。
2. runPendingJobs 双重 claim:claimRunnableJobsForOwner 已把 job 翻成 RUNNING,
随后又走 claimRunning(条件 PENDING/FAILED)必然失败 → job 被静默丢弃,
归属机的定时兜底从未真正生效。
修复:
- worker:非归属实例一律跳过 owner-scoped job;抽出 processClaimed 供已持有
claim 的调用方使用;processInternal 单独捕获 TaskOwnerMismatchException,
只 deferRunning 退回 PENDING,不计入重试。
- TaskFileJobLocalDispatcher 新增 dispatchClaimed。
- dispatch 事件带上 owner,coordinator 按归属路由:本机 owner 直接本地派发不发 MQ,
他机 owner 不发不跑交由归属机轮询接手,owner 为空维持原有 MQ 行为。
- 新增 owner 路由回归测试两组,回滚配合"本地抢跑"的旧断言。
同时提交此前工作区内已随 JAR 上线的 backend-java 改动:SimilarAsin 解析载荷
groups 内嵌 items(Python 旧链路兼容)与 chunk 类型不匹配跳过、
PermissionMenuSchemaInitializer 与 V103 两级菜单分组迁移、相关测试。
|
2026-09-01 21:07:25 +08:00 |
|
huangzd1997
|
55517f996b
|
task-120: 大页数据性能回归 + 恢复 similarasin 测试入库
性能回归(SimilarAsinTaskServicePerf500Test,8/8 绿):
- test_perf_light_200 原以墙钟毫秒比较 light 与 batch(assertTrue
lightMs < batchMs)。两条路径都跑纯内存 stub,耗时在十几毫秒量级,
JIT/GC/线程调度抖动远大于真实差值,本机实测 light 14ms / batch 13ms
直接翻红。改为确定性口径:light 结果明细查询数 == 0(batch ≥ 1)、
light 总查询数 < batch 总查询数、batch 条目携带任务明细对象而 light
只有白名单字段;墙钟仅保留单侧上界 1s(N+1 退化会放大到秒级从而失败)。
连续 3 次独立运行稳定通过。
- 类注释同步移除“已知 flaky,隔离重跑即接受”的说明。
恢复测试入库:
- fa5a59e(task-116) 把 similarasin 测试目录整体从 git 删除,并加了
.gitignore 规则 *.broken/,磁盘上目录改名 similarasin.broken。
但包声明仍是 com.nanri.aiimage.modules.similarasin.*,javac 照常编译,
这 40 个测试文件一直在参与构建、并且是 mvn test 的门禁的一部分——
等于脱离版本控制却仍在 gate 构建。
- 目录改回 similarasin/(现在与包声明一致),移除 *.broken/ 忽略规则,
40 个测试文件重新入库。mvn test-compile 退出码 0。
|
2026-09-01 13:45:34 +08:00 |
|
huangzd1997
|
fa5a59e5cd
|
task-116: 后台管理新增/导入表单弹窗化 + 分组管理独立菜单与UI优化 + 轻量进度端点
Build Backend JAR / build (push) Has been cancelled
- 后台管理页(admin)所有面板的新增/导入表单改为弹窗操作,原有字段 ID 全部保留、提交逻辑不变;导入删除入口不再触发二次确认拦截
- 分组管理升级为独立菜单(V102 + schema initializer),移除 5 个面板内的管理分组按钮;分组列表改为蓝白主题、增加权限分组横幅
- Python 侧 group-manage 权限守卫(_ensure_backend_menu_access 补充 group-manage)
- 引入 V101(biz_task_file_job 复合索引)+ 新增 TaskProgressLight/TaskFileJob 轻量端点与进度聚合作
- 前端 progress-light / page-separated-loads / dispatch-guard 共享模块及单元测试
|
2026-09-01 12:54:13 +08:00 |
|
huangzd1997
|
e2607ab723
|
task-98: 移除 similar-asin/appearance-patent 模块 Coze,状态机与共享组件改名 LLM
Build Backend JAR / build (push) Has been cancelled
- similarasin/appearancepatent 模块全部 Coze 工作流调用改走 direct-LLM(已确认唯一运行路径)
- 共享组件改名:CozeTaskQueueGate→TaskQueueGate、CozeGroupResultPropagator→GroupResultPropagator
- 状态机改名:biz_task_scope_state 的 coze_* 列→llm_*、stateJson coze 键→llm(V100 迁移已应用生产)
- 删除 biz_coze_credential 表、CozeCredential* 类、SimilarAsinCozeClient、AppearancePatentCozeClient→LlmClient
- 前端 brand 页 Coze 文案→LLM;Python 后端删除 cozepy 依赖与死配置
- 修复 TaskResultFileJobWorker 启动失败:TaskFileJobConfig 注册 ResultFileJobHandlerRegistry 与 13 个 handler bean(含 validateCoverage 启动校验)
|
2026-09-01 02:20:50 +08:00 |
|
huangzd1997
|
c8cd851b2f
|
feat: 外观专利改直连 LLM(DeepSeek/Gemini)、无效ASIN菜单更名 BRAND_DB、紫鸟店铺索引场景化
Build Backend JAR / build (push) Has been cancelled
- AppearancePatent:Coze 工作流切换为 llm-host 直连模型(title/appearance 双模型、行并发、重试),配置键迁移并保留旧环境变量兜底
- InvalidAsinDataMapper 补充按值+品牌唯一键查询
- ZiniaoShopIndexService 新增店铺分类/索引场景
- V98:无效ASIN菜单 rename 补充 BRAND_DB;docs 架构优化规划
- 配套单测更新
|
2026-08-31 17:04:59 +08:00 |
|
huangzd1997
|
14a41e64f1
|
feat: SimilarASIN 直连 LLM 通道(Gemini/DeepSeek 多模型)替代 Coze 工作流
- SimilarAsinLlmClient/Service:分类、符合性、图片比对三阶段直连 LLM
- PuzzleImageMerger:拼图合并用于图片比对
- direct-llm-enabled 开关 + llm-host/api-key/模型/超时/并发配置(默认开)
- LlmGatewayTlsProbe、SimilarAsinLlmLocalVerify 为本地验证工具
|
2026-08-31 17:02:53 +08:00 |
|
huangzd1997
|
7f4737c800
|
feat: 店铺密码检测任务(后台发起→客户端领取→紫鸟真实登录判定→回传结果)
- 新增 biz_shop_credential_check 表(V99)与 ShopCredentialCheck 全链路
- Controller /api/admin/shop-credential-checks(create/poll/report/latest,X-Internal-Token 鉴权)
- ShopManageService 列表附带 latestCheck(每店铺最近一次检测结果)
- 客户端通过 poll 领取(60s 轮询、原子置 RUNNING),报告 SUCCESS/FAILED/OTP_REQUIRED/NO_NEED_LOGIN/ERROR
|
2026-08-31 17:02:49 +08:00 |
|
huangzd1997
|
26f4bb3f25
|
后台菜单重构:菜单类型分组排序(软件在前/后台在后)、新增同类型末尾排序;任务中心分组移除,视频任务记录归入记录与版本、店铺数据记录归入店铺管理;界面名词优化(菜单权限配置/去重数据汇总/无效ASIN数据/视频任务记录/店铺数据记录/生成记录)
Build Backend JAR / build (push) Has been cancelled
|
2026-08-31 01:48:05 +08:00 |
|
huangzd1997
|
0408c9752e
|
fix: 菜单排序 app 分组优先于 admin,sort_order 按 menuType 作用域解析
Build Backend JAR / build (push) Has been cancelled
- menuComparator 增加 menuType 排序维度(app → admin → 其他)
- resolveSortOrder 查询限定同 menuType,避免跨类型尾部误判
- 抽出 loadRawMenus 保持原始 SQL 与比较器语义一致
|
2026-08-31 01:21:45 +08:00 |
|
huangzd1997
|
483374744a
|
fix: Spring 多构造器类显式 @Autowired 标注 + V95 迁移兼容 MySQL 8.4
Build Backend JAR / build (push) Has been cancelled
- CapacityPlanService / ExternalCallMetricsRecorder / ZiniaoClientImpl:
双构造器(生产 + 测试入口)导致 Spring 6 不自动推断构造器注入,
启动报 'No default constructor found';生产构造器显式加 @Autowired
- V95:shop_key 列 V85 建表时已有,原 ADD COLUMN shop_key 会报
duplicate column;MySQL 8.4 不支持 ADD COLUMN IF NOT EXISTS,改
information_schema 动态 SQL;shop_key 缩到 VARCHAR(255) 以容纳
(shop_key, business_date) 唯一键(1000 在 utf8mb4 下超 3072 字节
索引上限);删除多余行改为单表 DELETE
|
2026-08-31 01:09:19 +08:00 |
|
huangzd1997
|
c517711169
|
task-80: 补充 JVM 堆、直接内存、临时磁盘和连接池容量配置说明
|
2026-08-30 22:30:56 +08:00 |
|
huangzd1997
|
ba17e34b84
|
task-79: 为对象存储、数据库和队列增加故障注入测试
|
2026-08-30 22:23:33 +08:00 |
|
huangzd1997
|
42bbf4904e
|
feat-admin-ui-interaction
Build Backend JAR / build (push) Has been cancelled
|
2026-08-30 22:09:22 +08:00 |
|
huangzd1997
|
4c70ca4101
|
task-78: 为所有外部调用增加耗时、重试、失败率和 payload 字节指标
新增 ExternalCallMetricsRecorder:通过 RestClient 拦截器统一记录
aiimage.external-call.duration(耗时)、aiimage.external-call.total
(失败率)、aiimage.external-call.payload.bytes(请求字节)与
aiimage.external-call.retry.total(重试次数);Coze/品牌检查/紫鸟
三个外部客户端全部接入,指标注册表缺失时静默降级,不改变调用语义。
|
2026-08-30 22:01:02 +08:00 |
|
huangzd1997
|
39e52858d1
|
task-77: 统一 Coze、品牌检查和紫鸟 HTTP 客户端的连接复用策略
|
2026-08-30 21:08:28 +08:00 |
|
huangzd1997
|
04f45bebec
|
task-76: JSON owner 查询迁移到显式列并补充任务/状态复合索引
|
2026-08-30 20:51:07 +08:00 |
|
huangzd1997
|
6a4a115260
|
task-75: 虚拟线程任务等待队列上限与拒绝/延迟指标
|
2026-08-30 20:39:31 +08:00 |
|
huangzd1997
|
5105ca95c5
|
task-74: 隔离调度线程池、文件作业线程池和外部 Coze/图片执行池
|
2026-08-30 20:31:39 +08:00 |
|
huangzd1997
|
ec9811c8a5
|
task-73: 本地文件作业队列 in-flight 去重和队列背压
|
2026-08-30 20:22:58 +08:00 |
|
huangzd1997
|
baa43d80ba
|
task-72: 文件作业数据库原子 claim,避免重复派发同一 job
|
2026-08-30 20:01:18 +08:00 |
|
huangzd1997
|
6f32ed86e4
|
task-71: 清理日志改为数量与 sample ID,禁止输出超长任务 ID 列表
|
2026-08-30 19:53:49 +08:00 |
|
huangzd1997
|
9de4603484
|
task-70: 历史清理改为 keyset 分页、小批量和短事务
|
2026-08-30 19:48:59 +08:00 |
|
huangzd1997
|
5749a421cb
|
task-69: 历史清理任务收集 transient payload 指针并提交删除队列
|
2026-08-30 19:29:32 +08:00 |
|
huangzd1997
|
2de58b7afc
|
task-68: payload 引用删除改为批量引用检查与异步物理删除
- 新增 TransientPayloadDeleteOrchestrator:提交去重入队(maxPendingDeletes 上限),
flush 时一次性 IN 批量反查 biz_task_chunk / biz_task_scope_state,
未引用对象交由后台线程池异步物理删除(剥 rustfs: 前缀)
- 幂等:重复提交只入队一次;保守:查询失败整批保留可重试,不误删
- 空值/非指针忽略,本地/OSS 指针不在批量删除范围(各有归属与清理路径)
|
2026-08-30 19:13:43 +08:00 |
|
huangzd1997
|
2819fb3c6c
|
task-67: 复用 RustFS/MinIO 客户端与 HTTP 连接池
- buildClient 改为 double-check 懒加载缓存共享 MinioClient(volatile 单例),
同一实例持有同一 OkHttpClient,连接池随实例共享,不再每次操作新建客户端
- supplier 注入路径优先且不写共享缓存,测试隔离不受污染
- 未配置/空白 endpoint 时不创建实例,拒绝操作并保持缓存为空
|
2026-08-30 19:04:32 +08:00 |
|
huangzd1997
|
e2d6875ef9
|
task-66: 限制 RustFS 并发读写与重试的总资源预算
- 新增 aiimage.transient-storage.max-total-concurrent-operations 配置
(默认 0 不启用):跨 upload/read/delete 的总并发预算
- executeWithRetry 入口获取一个总许可,整次操作(含全部重试)全程占用,
重试不额外消耗,超预算立即拒绝并计入 operation=total rejected 指标
- 失败/完成后 finally 释放总许可,无残留锁;负值/0 视为未启用保持原行为
|
2026-08-30 18:57:26 +08:00 |
|
huangzd1997
|
9b1978aec8
|
task-65: transient payload 读取流式解压 + 解压后字节上限
- 新增 aiimage.transient-storage.max-decompressed-payload-bytes 配置
(默认 100MB,即 2x 存储上限),覆盖 gzip 二进制与 gzip64 兼容两条路径
- decodeGzipStream 按 8KB 缓冲流式解压,累计输出超过上限立即中止并报错,
防止压缩炸弹(zip bomb)在读取时无界膨胀内存
- 超限错误保留可识别消息(exceeds configured limit),由 resolvePayload 统一包装
|
2026-08-30 18:49:55 +08:00 |
|
huangzd1997
|
ca32cde4fe
|
task-64: transient payload 压缩改为直接 gzip 二进制流上传
- RustfsObjectStorageService 新增 uploadBytes/readObjectBytes 二进制流 API
(application/gzip),uploadText/readObjectAsString 改为其薄包装
- TransientPayloadStorageService 的 encodeStoredPayload 直接输出 gzip 字节,
不再经过 gzip64 + Base64 文本编码(消除 33% 体积膨胀与中间字符串副本)
- 读取端按 gzip magic 识别二进制流解压;兼容旧 gzip64: 文本与历史裸文本
- 本地回落文件同步改为写二进制(Files.write),超限判定基于 gzip 后字节数
|
2026-08-30 18:42:19 +08:00 |
|
huangzd1997
|
9c9b8a6078
|
task-63: 进度快照写入最小更新间隔节流(终态豁免+删除清理跟踪)
|
2026-08-30 18:28:15 +08:00 |
|
huangzd1997
|
8d91e599ab
|
task-62: 本地任务实体缓存共享组件(容量 LRU/TTL 即时回收/定时清理)接入 8 模块
|
2026-08-30 18:17:52 +08:00 |
|
huangzd1997
|
8e9c79fc0e
|
task-61: Rustfs 对象存储指标基线验收测试(计数/计时/分布/熔断/拒绝)
|
2026-08-30 18:00:33 +08:00 |
|
huangzd1997
|
305b897f2a
|
task-60: 采集模块 10k 行压测验收(结果完整性、内存与吞吐)
10k 行批量 upsert 压测验收:100 批 × 100 行恰好写入 10k 行不丢失不重复(引用 JSON 唯一);
10 chunk 分批提交总批量 SQL 调用次数恒定 100;hash 相等重复提交全跳过零写入(幂等);
batchSize=1 时 10k 次调用每批 1 行(内存受 batchSize 约束不无界累积);null/空白 ASIN
行安全跳过;前 50 批失败跳过后重试收敛到真实行数。collectdata 模块完成。
|
2026-08-30 17:43:13 +08:00 |
|
huangzd1997
|
7147fc464c
|
task-59: 采集模块对象存储与批量 SQL 调用次数验证
deleteHistory 删除历史结果的对象存储调用次数验证:批量 SQL(selectList/delete)调用次数
恒定不随行数增长;RustFS 物理删除按 chunk 引用指针去重后每对象一次(旧格式逐行一次);
空历史零调用、单历史单对象、300 行 100 chunk 恰好 100 次、非法越权拒绝、依赖失败传播后
重试成功无残留。锁定 task-57 引入的去重删除语义在 deleteHistory 路径上的调用次数契约。
|
2026-08-30 17:38:22 +08:00 |
|
huangzd1997
|
567cb1ab67
|
task-58: collectdata 结果明细读取失败降级(RustFS 超时跳过该 chunk,不中断其它 chunk)
chunk 级引用读取失败(RustFS 超时/不可用)时降级为跳过该 chunk 的引用行并记录 warn,
结果文件继续生成,缺失行由任务状态可观测;chunk 明细 JSON 损坏仍抛异常(数据问题不降级),
旧格式单行读取失败保持抛异常。失败 chunk 在单次调用内缓存为空哨兵,避免重复 resolve。
task-052 依赖失败测试同步更新为降级语义。
|
2026-08-30 17:31:21 +08:00 |
|
huangzd1997
|
5bbf601480
|
task-57: 删除任务/历史时先删 DB 行再物理删对象,引用计数反查基于删除后状态,共享对象跳过删除、独占对象真正释放
|
2026-08-30 17:20:00 +08:00 |
|
huangzd1997
|
adcfa28af3
|
task-56: 采集结果 Excel 改为临时文件+原子落位,流式写入或落位失败时清理临时文件,目标路径不残留半成品
|
2026-08-30 17:05:56 +08:00 |
|
huangzd1997
|
e7828dc926
|
task-55: 采集进度心跳改为节流/合并写,窗口内心跳只更新内存态不落库,窗口到期或任务结束路径强制持久化,避免高频 task UPDATE
|
2026-08-30 16:55:37 +08:00 |
|
huangzd1997
|
91f760f789
|
task-54: finalRowCount 改为任务内增量计数(upsert newlyInserted 累计),移除每 chunk 全表 COUNT(*)
|
2026-08-30 16:41:02 +08:00 |
|