大促时接口成片抛 HystrixRuntimeException: could not be queued for execution and fallback failed,接口逻辑很简单却大面积失败,线程池队列一直是满的,拒绝计数一直在涨,重启也只能缓几分钟。日志里能对上时间点,这种反而好排。
默认线程池只有十个线程,队列又设成五,下游一慢线程全被占死,等待超过一秒的请求直接被拒,连 fallback 都跟着一起排队,越等越糟。这一点先确认清楚,后面就不用反复试。
hystrix.threadpool.default.coreSize=50 hystrix.threadpool.default.maxQueueSize=0 hystrix.threadpool.default.queueSizeRejectionThreshold=0
围绕「Hystrix 线程池拒绝」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
报错里带路径的,先去看那个路径在不在、权限对不对。
处理上按这个顺序:按单接口的 QPS 乘平均 RT,估算一下到底需要多少线程数;队列改成 0 或者很小的值,让拒绝快速失败而不是堆积;fallback 里只做本地降级,别再发起一次远程调用去兜底。
结果对不对很好判断,压测时不再出现排队被拒的异常,超时请求直接走降级,主线程不被拖住。
