大併發下Timeout waiting for connection from pool 解決方案
阿新 • • 發佈:2019-02-02
當前專案採用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