大併發下Timeout waiting for connection from pool 解決方案

當前項目採用SpringCloud分佈式架構 , 服務間採用REST接口請求 . 最近頻發連接獲取超時(本質上是HttpClient的連接超時)的問題 , 如下圖 : 

這是因爲HttpClient在併發量高的時候 , 可能會出現連接池不夠用的情況 . 

 解決方案如下 : 

// 總連接數 值不應該過大 默認20
pollingConnectionManager.setMaxTotal(200);
// 同路由的併發數 , 默認值2 . 限制數量實際使用DefaultMaxPerRoute並非MaxTotal。
// 設置過小無法支持大併發(ConnectionPoolTimeoutException: Timeout waiting for connection from pool)
pollingConnectionManager.setDefaultMaxPerRoute(200);

maxConnTotal 和 maxConnPerRoute 的區別 ? 
maxConnTotal 是整個連接池的總數量大小 , 根據自己的業務需求進行設置
maxConnPerRoute 是單個路由連接的最大數 , 可以根據自己的業務需求進行設置
且 maxConnPerRoute * 路由數量 不會大於 maxConnTotal
比如maxConnTotal=200 , maxConnPerRoute=100 , 那麼如果只有一個路由的話 , 那麼最大連接數也就是100了;
如果有兩個路由的話 , 那麼它們分別最大的連接數是100 , 總數不能超過200

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章