晚上九点四十四分,临时账号正式启用。
周衡没有先碰重启按钮。
他让罗致远把订单确认延迟、数据库写等待、消息积压和计划任务放到同一个只读页面。四条曲线的时间范围全部拉回晚上六点半,避开扩容和多次重启造成的后续噪声。
最先变化的不是订单量。
七点零一分,一项“未确认订单对账”任务开始运行。数据库写等待几乎同时抬头,五分钟后订单确认开始变慢。海拓第一次增加消费进程时,等待连接数进一步上升;第二次扩容后,积压增长更快。
海拓值班负责人仍认为消息队列本身是瓶颈,提出先把队列节点再扩一组。
周衡让他把队列写入速度和消费确认速度分别拉出来。消息一直能正常进入,磁盘和网络也没有接近上限;真正下降的是订单写入完成后的确认。队列只是把来不及处理的订单保存下来,不是最先变慢的地方。
“扩队列能放下更多积压,不能让数据库更快写完。”他说,“先不动它。”
“这个对账任务今晚为什么提前跑?”周衡问。
丁卓在现场终端旁查工单:“下午改过执行时间。业务想在大促前先清一次历史未确认订单,变更单批准时间是六点四十分。”
“谁执行的不是重点。先看它做了什么。”
任务日志显示,它每次读取一批未确认订单,更新状态前还会调用仓储接口核对出库结果。外部接口一慢,数据库事务便一直不结束,同一批订单记录也始终被占着。
正常的订单确认进程需要更新其中一部分相同记录,等不到便超时重试。海拓增加的进程越多,同时排队等待的连接越多,最后连不相关的新订单也拿不到写入机会。
周衡没有凭这一条时间关系直接下结论。
他让数据库管理员保存当前活动事务、等待关系和任务日志快照。最长的一笔事务正来自对账账号,持续二十六分钟;后面排着四百多次订单确认写入。录屏完整拍下查询条件、结果时间和操作人。
“先停任务调度,不杀事务。”周衡说,“停止下一批进入。当前这批要确认已经做了哪些外部调用,直接终止可能让仓库状态和订单状态分开。”
罗致远在工单里批准暂停调度。
丁卓执行,回读状态:“调度已停,当前事务还在。”
仓储接口日志由嘉禾人员核对。当前批次发出过三百余次查询,没有写出库指令;数据库更新也尚未提交,终止后只需回滚本地未完成状态,不会撤回已经生效的业务动作。
这一结论被写进工单,数据库管理员才终止对账事务。
回滚用了七分钟。
写等待开始下降,积压曲线却没有立刻回头。前面扩出的消费进程仍在同时重试,数据库连接刚释放,便被大量旧请求再次占满。
“把并发降回原来的四分之一。”周衡说,“先别追求清积压,确认新写入能稳定完成。”
杜维成不在现场,海拓值班负责人在语音里质疑:“现在积压这么多,再降并发什么时候能清完?”
“现在的瓶颈是写入等待,不是进程数量。先让每一笔能完成,吞吐才会回来。继续加,只会让更多请求一起等。”
罗致远问:“回滚条件?”
“降并发后五分钟内,单笔确认耗时和等待队列没有持续下降,就恢复原配置,改走只读降级。现在所有变更值都写进工单。”
客户批准。
丁卓按记录把进程数降下来。第一分钟,积压仍然增长;第三分钟,数据库等待从高位落下一半;第五分钟,订单确认成功率开始恢复。
新的问题随即出现。
历史积压还排在前面,新付款订单即使能写,也要等旧订单逐条处理。继续按原顺序清,核心链路的延迟不会很快恢复。