1. 程式人生 > >大併發下Timeout waiting for connection from pool 解決方案

大併發下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