curl -s localhost:8081/actuator/metrics/tomcat.threads.busy | jq '.measurements' curl -s localhost:8081/actuator/metrics/http.server.requests | jq '.measurements'
商品详情依赖三个下游,其中一个平时 60 毫秒,故障后每次卡到 800 毫秒超时。上游 Tomcat 线程数 200,三分钟内 active 到 200,网关开始返回 504,不相关的接口跟着一起挂。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,上游没有给这条依赖单独隔离线程池,慢调用把所有工作线程占住,队列里的请求只能等。超时时间设得比下游自身超时还长,等于把等待时间叠加到了调用方。
「超时传导」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
处理上按这个顺序:按依赖拆独立线程池 单个下游最多占 30% 线程;把上游超时收到比下游短 200 毫秒 让它先放弃;对这类查询加快速失败 超过阈值直接走缓存;压测时单独打慢一个下游 看其他接口是否受影响。
改完只确认一件事:单独打挂一个下游后,其他接口 P99 波动不超过 20 毫秒,Tomcat busy 线程不超过 60。
