perf(cmpp): reduce inbound database round trips

This commit is contained in:
hectorzhao
2026-08-20 15:29:45 +08:00
parent 67b760a599
commit 14f993c1f8
12 changed files with 153 additions and 24 deletions
+9
View File
@@ -3761,3 +3761,12 @@ git diff --check
- 50条/秒触发停止线:因客户端背压只生成2790条而非约2999条,2787条成功、3条等待API满10秒后返回result=9P50/P95/P99=`6765/7236/7789ms`throttled ticks=3184。结束后命令Stream一度`pending=64/lag=489`、结果Outbox`pending=8/lag=1690`;命令约1分钟内、结果随后约20秒内归零。日志显示API饱和时协议遥测和连接状态回调超时,并暴露既有`CmppDownstreamConnection`创建/更新的P2002/P2025竞态;未出现`resultEventId`唯一键冲突或Outbox事件失败。停止后未继续上探。
- 整个窗口客户侧共9984条业务提交,真实PostgreSQL按`queuedAt`精确新增9984条;窗口内7922条实际供应商提交记录全部具有非空且互不重复的`resultEventId`,重复事件组0、Gateway Submit死信0。提交结果为accepted 7392、rejected 147、timeout 383;客户有限回执收集窗口和重连积压回执不替代数据库/Stream对账。最终确认40条/秒为当前测试环境安全档,50条/秒瓶颈转为API/数据库同步入站及遥测争用,后续应继续V1的重复查询/零散写入合并和P1分阶段指标分析。
- 本轮只连接隔离供应商模拟器`100.91.249.119:17900`,没有发送、补发或重投真实短信,没有修改真实通道账号、密码、启停状态、企业余额或客户连接。压测原始目录沿用既有`lg-v2-*`名称,但被测运行标识与结论均为V4;完整V4报告保存在短信平台测试项目。受保护的`api/tsconfig.build.tsbuildinfo``tsconfig.tsbuildinfo``outputs/``pnpm-lock.yaml`和空文件`=`继续排除提交、不删除、不归因。
# 2026-08-20 CMPP压测优化V5:API入站数据库往返治理(本地完成、待授权发布复测)
- 接管复核确认本地`HEAD=67b760a5992d7ae10d7889fe6765e895d238ab3d``origin/main=c4f36fc50d7906dfb2f97c881e9ea43c6a64c370`,本地领先5个提交;测试环境只读标识仍为`485af688d21ee0bdb98281f4c20d151d69f7889f+workspace.v4.a63885439ed5`,预生产只读标识仍为`433b2ee56f6016ad8afff1bac73f510b8fd53083+gateway-v2.cd7bb8d05e7b`。本轮没有发布、回退、提交或推送。
- V4高负载证据显示两次`application_lookup`合计约191.44ms、`risk_frequency`约677.38ms、`queue_publish`约242.43ms。代码复核确认每个目标号码会重复查询入口已取得的应用/企业/IP白名单;任务风控与号码频控各自调用默认规则检查,旧实现每次按5条规则逐条查询,单条短信可产生两轮共约10次存在性SQL;通用入队又回查刚创建的任务和消息。
- V5复用Submit入口已经校验的应用快照并显式传入每个目标号码,删除第二次`application_lookup`;默认规则完整性改为30秒短TTL和并发单飞,正常完整状态使用一次聚合count,失败立即清除缓存,实际生效规则、应用规则和号码频控状态仍逐消息读取;缺失时继续走既有逐规则确认和创建逻辑。刚持久化的单条CMPP内部消息使用已知taskId、messageRecordId和queuePriority直接添加BullMQ任务,不再回查任务和消息;普通批量任务继续使用原通用入队路径。
- 只读测试环境PostgreSQL `EXPLAIN (ANALYZE, BUFFERS)`确认应用查询使用`SmsApplication_cmppAccount_key`,执行约0.046ms;默认规则聚合检查使用`RiskRule_applicationId_code_key`并命中5行,执行约0.047ms。现有索引已经匹配查询,因此本轮不增加猜测性索引或migration;测试环境未安装`pg_stat_statements`,没有为诊断修改数据库扩展或配置。
- 本地API TypeScript正式编译通过;API全量42套487项全部通过,其中`RiskReviewService``SendChainService`专项覆盖默认规则并发单飞/短缓存/失败重试/缺失恢复、单Submit只查一次应用、已知消息直接入队且不回查任务/消息,以及既有多号码、模板、频控、计费、补发和回执回归。5份Gateway队列契约、R0、R6、R7、R10和`git diff --check`通过;R9门禁在本轮已更新的`enqueueBatchTask`哈希通过后,被HEAD既有且本轮未修改的`dispatchDueScheduledTasks`哈希漂移阻断(契约期望`8fd154...`、当前方法`37db96...`),未为通过本需求门禁而改写或归因该并行历史。Jest使用`--forceExit`收尾仓库既有异步句柄;首次从仓库根目录误启动时扫描受保护`outputs/`并使用错误转换配置,未修改或删除其中任何文件,随后在`api`目录按项目配置重跑通过。
- 当前尚未部署虚拟机测试环境或执行V5阶梯压测;`TC-CMPP-PERF-V5-005`需在取得明确发布授权、建立PostgreSQL/运行源码/环境恢复资产后执行。没有发送、补发或重投真实短信,没有修改通道账号、密码、启停状态、企业余额或客户连接;`api/tsconfig.build.tsbuildinfo``tsconfig.tsbuildinfo``outputs/``pnpm-lock.yaml`和空文件`=`继续保护、不归因。