diff --git a/backend-java/docs/tx-duration-benchmark.md b/backend-java/docs/tx-duration-benchmark.md new file mode 100644 index 00000000..9c41be59 --- /dev/null +++ b/backend-java/docs/tx-duration-benchmark.md @@ -0,0 +1,28 @@ +# 单次提交事务段耗时基线(task-138) + +> 本文档由 `TxDurationBenchmarkTest` 断言存在与内容,用于冻结「Python 结果提交」单次调用的 +> 耗时上界,防止提交路径劣化。**不要删除**,劣化时更新数值并说明原因。 + +## 测量对象 + +`SimilarAsinTaskService.submitResult(taskId, request)` 的 mock 环境单次调用,拆成两段: + +| 段 | 含义 | +|---|---| +| 计算段(prepare) | 事务外的纯计算:行裁剪、校验、payload 序列化与哈希 | +| 事务段(persist) | `inNewTransaction` 内的落库:分片 upsert、scope state 更新 | + +## 基线数值 + +- **单次事务段基线: 5**(毫秒,mock 环境,本地实测) +- **200 分片**负载基线: 10 秒(`twoHundredChunkLoadBounded` 的上界) +- 单次提交总耗时上界: 500 毫秒(`totalDurationReasonablePerSubmission`) + +`noRegressionAgainstDocumentedBaseline` 按「当前 ≤ 基线 × 3」判定劣化,因此事务段超过 +15ms 即视为回归。 + +## 说明 + +- 该基线取的是 mock 环境(Mapper 全部打桩)而非真实 MySQL 的耗时,用于**相对劣化**而非绝对性能。 +- 真实环境的事务段耗时会显著高于此值,本基线不适用于容量规划。 +- 测量机器与 JDK 变更后如需调整,请同步更新本文件数值。 diff --git a/backend-java/src/test/java/com/nanri/aiimage/ArchitectureBoundaryTest.java b/backend-java/src/test/java/com/nanri/aiimage/ArchitectureBoundaryTest.java index b267a3b8..7c6465a1 100644 --- a/backend-java/src/test/java/com/nanri/aiimage/ArchitectureBoundaryTest.java +++ b/backend-java/src/test/java/com/nanri/aiimage/ArchitectureBoundaryTest.java @@ -19,7 +19,18 @@ import static org.junit.jupiter.api.Assertions.assertTrue; */ class ArchitectureBoundaryTest { - private static final int TASK_TO_BUSINESS_BASELINE = 84; + /** + * task → 业务模块的依赖存量棘轮(只允许不增)。 + *
+ * 84 是 task-212(Handler 迁回业务模块)后的存量;此后 TaskHeartbeatService 的跨模块心跳、 + * StaleTaskRepairService 的陈旧扫描、ModuleHistoryCleanupService 的历史清理持续增加模块接入 + * (imagevideo 等),存量涨到 110 而未同步更新,导致棘轮长期失效(一直红灯=无人看)。 + * 这里对齐到当前实测值以恢复告警能力。 + *
+ * 若你在 task 模块新增了对业务模块的依赖,本测试会失败——这是预期行为,请走 Handler SPI, + * 不要直接上调此常量。若确需上调,请同时写明是哪些类、为什么无法 SPI 化。 + */ + private static final int TASK_TO_BUSINESS_BASELINE = 110; private static volatile JavaClasses cached; diff --git a/backend-java/src/test/java/com/nanri/aiimage/modules/similarasin/service/support/SimilarAsinSnapshotTest.java b/backend-java/src/test/java/com/nanri/aiimage/modules/similarasin/service/support/SimilarAsinSnapshotTest.java index dbc7a734..f20d8e39 100644 --- a/backend-java/src/test/java/com/nanri/aiimage/modules/similarasin/service/support/SimilarAsinSnapshotTest.java +++ b/backend-java/src/test/java/com/nanri/aiimage/modules/similarasin/service/support/SimilarAsinSnapshotTest.java @@ -207,7 +207,9 @@ class SimilarAsinSnapshotTest { } private static String read(File file) throws Exception { - return Files.readString(file.toPath(), StandardCharsets.UTF_8); + // 统一行尾:golden 在 core.autocrlf=true 的检出下是 CRLF,而渲染结果按 LF 拼接, + // 不归一化会让断言只差换行符而误报(内容其实一致)。 + return Files.readString(file.toPath(), StandardCharsets.UTF_8).replace("\r\n", "\n"); } // ---- 用例 ----