已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
背景:我在维护一个订单中台,入口 QPS 约 1500,单次请求平均要串行调用 2~3 个下游(库存服务、价格服务、风控服务),其中价格服务最终会落到 MySQL 做聚合查询。整体链路我做了三层超时:Tomcat/网关 800ms → Spring Cloud 服务调用 500ms → HikariCP 连接获取 200ms + socket 读超时 800ms。连接池 maxSize=40,核心配置没做过激进调整。
现象:上周一次 MySQL 主从切换,从库上有一条聚合 SQL 从平时的 30ms 飙到 1200ms+。结果非常反直觉:从 SQL 变慢开始算,不到 30 秒,HikariCP 连接池被完全打满(active=maxSize,pending 队列里堆了几千个线程),进而导致整个订单接口 P99 直接打到 800ms 超时,甚至开始 5xx。更诡异的是,MySQL 侧 SHOW PROCESSLIST 里活跃连接数并没有超过 40,说明连接是被应用侧占住了没释放,而不是数据库侧真的在跑 40 条慢 SQL。
已尝试的排查:
active 在 30 秒内从个位数爬到 40;HikariPool.getConnection 等待 pending;SocketImpl 而不是 Socket,setSoTimeout 被绕过去了;期望得到的答案:想请教社区里做过类似治理的同学:
MAX_EXECUTION_TIME 兜底?最好能带上具体的配置片段或线上数据,谢谢。