1. 程式人生 > >RestTemplate超時引發的血案

RestTemplate超時引發的血案

最近線上出了一次故障,收銀臺系統所有服務全部假死。訂單量瞬時下降,造成很大損失。

故障總結,導致問題的原因有兩方面:

資料庫慢查詢

 ●  RestTemplate超時時間設定不生效。

 ●  spring-web不同版本設定RestTemplate方式不完全一樣。

預設超時設定

預設情況下是沒有超時設定的,此時超時依賴兩方面:

依賴TCP連線本身的超時時間(tcp空閒連線,超過一定時間,連線會被關閉)。 請求所經過的網路節點的超時時間。e.g. 中間經過nginx, nginx預設讀取後端服務的超時時間是60s,所以超時時間在60s左右(日誌顯示稍微大一點,不會大很多)。

程式碼分析

例子

 
  1. long start = System.currentTimeMillis();

  2. try {

  3. RestTemplate restTemplate = new RestTemplate();

  4. Map responseObject = restTemplate.getForObject(url, Map.class);

  5. System.out.println(responseObject

    );

  6. } catch (Exception e) {

  7. Assert.assertNotNull(e);

  8. System.out.println("timeout = " + (System.currentTimeMillis() - start));

  9. }

原因: RestTemplate繼承自 HttpAccessor, 預設使用的 ClientHttpRequestFactory是 SimpleClientHttpRequestFactory

原文連結