一,問題
並發測試,對外接口測試50個並發的時候開發報錯,報錯信息類似如下:
{"status":"0500","message":"GiftExchangeOrderClient#queryExchangeGifts(String,String,String,String) could not be queued for execution and no fallback available.","data":null}
二,方案
hystrix:
command:
default:
execution:
timeout:
enabled: true
isolation:
strategy: THREAD
semaphore:
maxConcurrentRequests: ${HYSTRIX_COMMAND_MAXCONCURRENTREQUESTS:1000}
thread:
timeoutInMilliseconds: ${HYSTRIX_COMMAND_TIMEOUTINMILLISECONDS:30000}
threadpool:
default:
## 並發執行的最大線程數,默認10
coreSize: ${HYSTRIX_THREADPOOL_CORESIZE:500}
## BlockingQueue的最大隊列數
maxQueueSize: ${HYSTRIX_THREADPOOL_MAXQUEUESIZE:500}
## 即使maxQueueSize沒有達到,達到queueSizeRejectionThreshold該值后,請求也會被拒絕
queueSizeRejectionThreshold: ${HYSTRIX_THREADPOOL_QUEUESIZEREJECTIONTHRESHOLD:300}
三,原理
1:hystrix的連接線程池限制
## 並發執行的最大線程數,默認10
coreSize: ${HYSTRIX_THREADPOOL_CORESIZE:500}
## BlockingQueue的最大隊列數
maxQueueSize: ${HYSTRIX_THREADPOOL_MAXQUEUESIZE:500}
## 即使maxQueueSize沒有達到,達到queueSizeRejectionThreshold該值后,請求也會被拒絕
queueSizeRejectionThreshold: ${HYSTRIX_THREADPOOL_QUEUESIZEREJECTIONTHRESHOLD:300}
2:hystrix的超時設置
並發大的情況下,響應時間會很長,hystrix的默認超時時間是3秒內,故也會報接口錯誤問題
調整
timeoutInMilliseconds: 30000
除了hystrix的超時設置之外,還有ribbon超時設置
四,其他方案
1: 接口增加緩存
2: 接口調用優化,重復調用的接口考慮優化