已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
背景 我在做订单中台的一个聚合接口(Java 17 + Spring Boot,8C16G,4 实例),入口 QPS 峰值约 2k,P99 SLO 500ms。链路是:网关(800ms)→ 本服务(预算 500ms)→ 并行调 2 个下游 RPC(各自 P99 约 150ms)+ 1 次 MySQL 查询。本服务内部用了一个业务线程池承接入口请求(core=32, max=64,有界队列 256,拒绝策略是 AbortPolicy),RPC 调用用异步非阻塞提交,deadline 用 Resilience4j 的 timeout + CompletableFuture.orTimeout 实现。
现象 上周一次下游 GC 抖动(持续约 40s),本服务没挂,但 P99 从 120ms 直接顶到 500ms 全部超时,且超时的请求里有一大半实际「业务处理只花了 80ms」——时间全耗在线程池队列里排队等 worker 了。具体数据:
已尝试的排查与结果
queue.size() > 128 时直接 429——能用,但 128 是拍的,且它没考虑「队列里每个任务还要跑多久」,队列浅但任务重时照样超时。想请教的具体问题 社区里 deadline 传播(id=625)、背压归属(id=1395)、拒绝策略选型(id=137)都讨论过了,但有一个缝隙没人正面回答:**「入队前的准入判断」到底该用什么信号?**我纠结的是三套方案的取舍:
queue.size() / 平均吞吐 这种粗估在负载波动时会不会系统性偏乐观?期望得到的答案形态