定时调度性能修复交接(截至 2026-07-24)

交接文档
2026年8月6日3 min read415 words

Updated 2026年8月6日

定时调度性能修复交接(截至 2026-07-24)

历史说明:本文记录的是 2026-07-24 的运行状态。2026-08-04 起仓库已移除 Flyway,V7/V10/V11 的结构与稳定种子数据收敛到 backend/src/main/resources/db/migration/V1__initial_schema_and_seed.sql;文中的 schema version 7、V7 和旧回滚步骤仅供追溯,当前新空库只允许手工执行 V1,已有业务库不得重复执行。

1. 当前结论

  • 原规则任务实例 60 处理 470,269 条评估耗时约 43 分钟,根因是全量历史写入、旧/新结果两次翻状态和单个长事务,不是死锁或机器不足。
  • 第一阶段 SQL 与事务优化未达到 5 分钟目标,已按门槛实施第二阶段:新增当前评估窄指针,并将评估暂存改为按 CGI 最多四路并行。
  • Flyway V7 已成功应用;tb_metric_evaluation_current 与迁移前当前评估数量均为 470,269,schema version 为 7。
  • 二阶段完整压测已通过:实例 63 处理 470,269 条,端到端约 3 分 58 秒,最终原子发布约 1 秒,满足 5 分钟/60 秒验收门槛。
  • 功能回归与目标测试通过,当前可以进入部署前复核和受控灰度;本地 8082 后端已停止,避免测试调度继续运行。

2. 已完成事项

数据与功能

  • CGI 已从 TEST2-460-00-* 规范为 460-00-*,性能与底噪共同 CGI 为 20 个。
  • 已发布动态基线配置 CFG-20260722120000-CGI-FIX,覆盖 7 个指标。
  • 共现率为 0 时返回可用的 0;特征异常率为 0 时 Lift 返回无定义原因,不再统一报“无配对样本”。
  • 前端 Lift 空态优先展示后端逐特征原因;平均底噪读取规范 CGI 的已发布源值。

调度性能

  • baselineSourceRows 已改为一次聚合最新范围,基线实例 57 从约一小时无结果降到约 2 分钟完成。
  • 下游基线、预测、回测、规则实例会继承上游 tb_schedule_run_scope
  • 规则计数与评估写入使用相同的发布运行、CGI 和业务时间范围。
  • 规则任务已拆为输入固化、评估暂存、告警证据暂存、原子发布四个事务阶段。
  • 运行中会更新 heartbeat_at/result_count,阶段日志包含 traceId、运行 ID、数量和耗时。
  • 失败或停止会保留旧当前指针,并将本次评估快照标记失败。
  • V7 新增 tb_metric_evaluation_current;页面和基线经指针读取当前评估,不再批量更新历史评估为 SUPERSEDED
  • 评估暂存按 CGI 最多四路并行,最终事务只切换窄指针、发布告警和发布运行。

3. 数据库与运行状态

  • 本地后端地址:http://localhost:8082
  • 当前状态:已停止,无 8082 监听;需要继续验证时再启动
  • 日志:backend/app-8082-performance.stdout.logbackend/app-8082-performance.stderr.log
  • schema version:7
  • 当前指针数:470,269
  • 迁移前当前评估数:470,269
  • uk_metric_eval_current 已删除,当前唯一性由 tb_metric_evaluation_current.metric_result_id 保证。

压测实例:

实例 状态 说明
60 SUCCEEDED 旧实现基准,470,269 条,约 43 分钟
61 FAILED 第一轮压测,发现 scope 连接执行计划错误后主动终止
62 FAILED 第二轮压测,确认单线程暂存约 400~500 条/秒后主动终止
63 SUCCEEDED 二阶段完整验收,470,269 条,约 3 分 58 秒,发布约 1 秒

实例 61、62 的失败为受控压测终止,不是业务数据故障;当前发布结果未受影响。

4. 主要修改文件

  • backend/src/main/java/com/chinamobile/g5b2/service/scheduling/PipelineTaskService.java
  • backend/src/main/java/com/chinamobile/g5b2/mapper/scheduling/PipelineTaskMapper.java
  • backend/src/main/java/com/chinamobile/g5b2/mapper/scheduling/SchedulingMapper.java
  • backend/src/main/resources/mapper/scheduling/PipelineTaskMapper.xml
  • backend/src/main/resources/mapper/scheduling/SchedulingMapper.xml
  • backend/src/main/resources/mapper/published/PublishedDataMapper.xml
  • 已并入 backend/src/main/resources/db/migration/V1__initial_schema_and_seed.sql;历史迁移文件不再保留。
  • backend/src/test/java/com/chinamobile/g5b2/service/scheduling/PipelineTaskServiceTest.java
  • backend/src/test/java/com/chinamobile/g5b2/mapper/MapperXmlConfigurationTest.java
  • docs/数据库表结构与指标口径设计.md

前序功能修改还包括 PublishedDataService.javaPerformancePage.tsxPublishedDataServicePerformanceTest.java

5. 已完成验证

  • 第一阶段目标测试:24/24 通过。
  • 第二阶段目标测试:16/16 通过,包括 Mapper XML、规则事务、指针 SQL 和共现率/Lift 回归。
  • 注解 SQL 扫描:无匹配。
  • 前序前端 npm run build:通过,仅有既有 chunk size warning。
  • 全量 Maven 测试存在 5 个既有 NoClassDefFoundError,涉及 Audit/Baseline/Model Controller/Service,与本次修改无关;本次目标测试均通过。

6. 接手后的执行顺序

  1. 空库部署前手工执行评审后的 V1__initial_schema_and_seed.sql;已有业务库不重复执行,应用启动不执行迁移。
  2. 在预发布环境执行目标 Maven 测试、Mapper XML 装配测试和注解 SQL 扫描,并确认 tb_metric_evaluation_current 指针逐键一致。
  3. 首次灰度仅启用一个规则实例,使用独立 X-Trace-Id,监控四阶段耗时、连接池等待、数据库 CPU/IO 和最终发布事务时长。
  4. 发布后核对指针数、每指标评估状态、20 个共同 CGI 同小时配对、共现率/Lift、平均底噪和告警证据。
  5. 保持验收门槛:50 万补数/重放不超过 5 分钟,常规小时增量不超过 30 秒,最终发布事务不超过 60 秒。
  6. 若暂存阶段失败,确认旧指针不变;若最终发布异常,先停规则调度并按第 7 节整体回滚协议处理,不直接启动 V6 应用。

7. 风险与回滚

  • V7 已删除旧评估当前唯一索引。二阶段成功发布后,旧应用会错误地直接按 publish_status/current_marker 读取多个历史快照,因此不能只回滚应用包。
  • 如需回滚,必须先停止规则任务,并同步恢复旧读路径、旧发布切换协议和唯一约束;不能直接启动 V6 代码。
  • 四路并行会占用最多 4 个数据库连接;本地完整压测未出现连接或事务残留,预发布和生产灰度仍需观察连接等待及数据库 CPU/IO。
  • 当前仓库根目录没有 .git,无法用 git diff/status 生成变更清单;交接以以上文件和测试结果为准。

8. TraceId

  • CGI 维护:maintenance-cgi-normalize-20260722
  • 配置发布:maintenance-analysis-config-20260722
  • 原基线/规则链:maintenance-baseline-optimize-20260722
  • 第一轮压测:benchmark-rule-hotfix-20260722
  • 第二轮压测:benchmark-rule-hotfix2-20260722
  • 二阶段完整验收:benchmark-rule-hotfix3-20260723

9. 第三次压测与复核结果(2026-07-23)

  • 使用独立 trace benchmark-rule-hotfix3-20260723,复制失败实例 62 的 4 条已发布输入血缘创建受控测试实例 63;未修改导入事实、指标发布结果、配置或历史实例。
  • 实例 63(发布运行 24)于 09:04:54 开始、09:08:52 完成,端到端耗时约 3 分 58 秒,result_count=470269,实例和发布运行均为 SUCCEEDED/PUBLISHED
  • 阶段耗时:输入固化 2.4 秒;按 CGI 并行暂存指标评估 121.1 秒;告警和证据暂存 30.9 秒;原子切换发布约 1 秒。满足端到端不超过 5 分钟、发布事务不超过 60 秒的验收门槛。
  • 数据验收:tb_metric_evaluation_current 为 470,269 行且全部指向发布运行 24;发布运行 24 评估为 470,269 行、覆盖 21 个 CGI;无活动 InnoDB 事务;失败实例 61、62 未改变当前指针。
  • 复核结论:ruleScopeCgis(instance_id,cgi) 唯一范围分片,insertMetricEvaluations 使用 m.cgi = #{cgi} 且输入发布运行有唯一约束,四路并行不会重复计数;页面评估读取统一经 V7 当前指针,失败/停止路径保持旧指针不变。此前实现未发现需要回滚的偏移。
  • 目标测试 PipelineTaskServiceTestMapperXmlConfigurationTest 通过,注解 SQL 扫描仍无匹配。第三次压测后已停止本地 8082 后端,避免测试调度继续运行。