已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
【背景】
我负责一个 B 端聚合网关(JDK 17 + Spring Boot 3,单机 8C16G,K8s cpu limit=4),对外 QPS 峰值约 2k。线程池是业务侧自己用 ThreadPoolExecutor 建的(没走 Tomcat 工作线程),core=16、max=32,下游是一批 RPC + HTTP 调用,P99 目标 200ms。
【现象】 压测里两种队列表现差异巨大:
LinkedBlockingQueue(1024) + CallerRunsPolicy:QPS 拉到 2.5k 时,P99 从 120ms 直接飙到 900ms+,且抖动很「整」——一抖就是几十个请求一起超时,像是队列堆积后 CallerRuns 把 Tomcat 工作线程也拖下水了;SynchronousQueue + AbortPolicy:QPS 1.8k 就开始抛 RejectedExecutionException,但 P99 反而稳在 150ms 以内。另外我们链路里混着「快任务」(查缓存 5ms 级)和「慢任务」(聚合 3 个下游 80~180ms),同池混跑,怀疑慢任务把队列占住导致快任务排队。
【已尝试】
【期望答案形态】