RestTemplate超時引發的血案
阿新 • • 發佈:2018-11-27
最近線上出了一次故障,收銀臺系統所有服務全部假死。訂單量瞬時下降,造成很大損失。
故障總結,導致問題的原因有兩方面:
資料庫慢查詢
● RestTemplate超時時間設定不生效。
● spring-web不同版本設定RestTemplate方式不完全一樣。
預設超時設定
預設情況下是沒有超時設定的,此時超時依賴兩方面:
依賴TCP連線本身的超時時間(tcp空閒連線,超過一定時間,連線會被關閉)。 請求所經過的網路節點的超時時間。e.g. 中間經過nginx, nginx預設讀取後端服務的超時時間是60s,所以超時時間在60s左右(日誌顯示稍微大一點,不會大很多)。
程式碼分析
例子
-
long start = System.currentTimeMillis();
-
try {
-
RestTemplate restTemplate = new RestTemplate();
-
Map responseObject = restTemplate.getForObject(url, Map.class);
-
System.out.println(responseObject
-
} catch (Exception e) {
-
Assert.assertNotNull(e);
-
System.out.println("timeout = " + (System.currentTimeMillis() - start));
-
}
原因: RestTemplate繼承自 HttpAccessor, 預設使用的 ClientHttpRequestFactory是 SimpleClientHttpRequestFactory