Spring Cloud Hystrix線程池不足的解決方法
現(xiàn)象:
昨天突然線上很多接口獲取失敗,通過 kibana發(fā)現(xiàn)大量異常,具體異常信息:
...into fallback. Rejected command because thread-pool queueSize is at rejection threshold.
異常代碼出處:
@FeignClient(name = "api", fallbackFactory = LoadBalancingFallbackFactory.class)
public interface LoadBalancingFeignClient {
@PostMapping(value = "/api/loadBalancing/server")
Result currentServer();
}
@Slf4j
@Component
public class LoadBalancingFallbackFactory implements FallbackFactory<LoadBalancingFeignClient> {
@Override
public LoadBalancingFeignClient create(Throwable throwable) {
final String msg = throwable.getMessage();
return () -> {
log.error("loadBalancingFeignClient currentServer into fallback. {}", msg);
return Result.error();
};****
}
}
原因:
看到這里已經(jīng)很明顯了,是由于hystrix線程池不夠用,直接熔斷導致的。
項目apollo配置:
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds = 3500 hystrix.threadpool.default.maxQueueSize = 60 hystrix.threadpool.default.queueSizeRejectionThreshold = 40
hystrix參數(shù)簡析:
maxQueueSize:線程池大小,默認為-1,創(chuàng)建的隊列是SynchronousQueue,如果設置大于0則根據(jù)其大小創(chuàng)建LinkedBlockingQueue。
queueSizeRejectionThreshold:動態(tài)控制線程池隊列的上限,即使maxQueueSize沒有達到,達到queueSizeRejectionThreshold該值后,請求也會被拒絕,默認值5
相關源碼:
hystrix-core-1.5.12-sources.jar!/com/netflix/hystrix/strategy/concurrency/HystrixContextScheduler.java
private class HystrixContextSchedulerWorker extends Worker {
private final Worker worker;
private HystrixContextSchedulerWorker(Worker actualWorker) {
this.worker = actualWorker;
}
@Override
public void unsubscribe() {
worker.unsubscribe();
}
@Override
public boolean isUnsubscribed() {
return worker.isUnsubscribed();
}
@Override
public Subscription schedule(Action0 action, long delayTime, TimeUnit unit) {
if (threadPool != null) {
if (!threadPool.isQueueSpaceAvailable()) {
throw new RejectedExecutionException("Rejected command because thread-pool queueSize is at rejection threshold.");
}
}
return worker.schedule(new HystrixContexSchedulerAction(concurrencyStrategy, action), delayTime, unit);
}
@Override
public Subscription schedule(Action0 action) {
if (threadPool != null) {
if (!threadPool.isQueueSpaceAvailable()) {
throw new RejectedExecutionException("Rejected command because thread-pool queueSize is at rejection threshold.");
}
}
return worker.schedule(new HystrixContexSchedulerAction(concurrencyStrategy, action));
}
}
解決辦法:
- 適當調(diào)大Hystrix線程隊列參數(shù)
- 動態(tài)水平擴容服務
- 優(yōu)化下游服務,減少服務響應時間
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- Spring Cloud Hystrix異常處理方法詳解
- SpringCloud斷路器Hystrix原理及用法解析
- SpringCloud項目集成Feign、Hystrix過程解析
- SpringCloud之熔斷監(jiān)控Hystrix Dashboard的實現(xiàn)
- SpringCloud之熔斷器Hystrix的實現(xiàn)
- SpringCloud Hystrix-Dashboard儀表盤的實現(xiàn)
- SpringCloud微服務之Hystrix組件實現(xiàn)服務熔斷的方法
- Spring Cloud 的 Hystrix.功能及實踐詳解
- Springcloud hystrix服務熔斷和dashboard如何實現(xiàn)
相關文章
SpringBoot調(diào)用對方webService接口的幾種方法示例
平常我們開發(fā)調(diào)用接口一般會用到幾種數(shù)據(jù)格式,比如有restful的,這個是目前最流行的,也是最簡單開發(fā)的,還有一種就是webservice數(shù)據(jù)格式,本文給大家介紹了幾種SpringBoot調(diào)用對方webService接口的方法,文中有相關的代碼示例供大家參考,需要的朋友可以參考下2023-11-11
spring boot使用自定義配置的線程池執(zhí)行Async異步任務
這篇文章主要介紹了spring boot使用自定義配置的線程池執(zhí)行Async異步任務,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01
Java如何優(yōu)雅關閉異步中的ExecutorService
在并發(fā)編程領域,Java的ExecutorService是線程池管理的關鍵接口,這篇文章主要為大家介紹了如何優(yōu)雅關閉異步中的ExecutorService,需要的可以了解下2025-02-02

