成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring項目不要忽視這個超時配置,否則你的Http調用可能無法結束

開發 項目管理
我們在總結以下Spring中Http請求的3個關鍵的超時配置吧,其中connectionRequestTimeout 最容易被忽視的。

?前言

不知道你有沒有過這樣的經歷,你的Spring項目通過http接口遠程調用外部系統時,通常你會設置超時時間,比如5秒鐘,但是實際情況卻是由于外部系統出現故障并導致連接超時,有些請求花費遠遠超過5秒時間,甚至1分鐘,這直接導致你本身的接口響應很慢,如果訪問你接口的流量很大的話,甚至拖垮你的系統,這將會是災難性的后果。

圖片

你可能會好奇到底是什么原因導致的,很可能是你忽略了這個超時配置項connectionRequestTimeout導致的。

Spring中的連接池

在深入了解 connectionRequestTimeout 之前,我們需要了解外部 HTTP 請求是如何在 Spring 中進行的。

圖片

Spring 通過Http調用外部系統的時候,會使用連接池去管理他們。因為HTTP請求創建連接代價比較高,而連接池可以做到連接的復用,回過頭,我們思考下為什么會代價高呢?

  • DNS 解析:在建立連接之前,客戶端必須首先使用域名系統 (DNS) 將服務器的域名解析為 IP 地址。DNS 解析可能需要時間,尤其是在客戶端的 DNS 緩存很冷且服務器的域名尚未緩存的情況下。
  • TCP 握手:確定服務器的 IP 地址后,客戶端必須與服務器建立 TCP 連接。這涉及三次握手過程,這可能會花費時間并增加請求的開銷。
  • SSL/TLS 協商:如果服務器使用 HTTPS,客戶端還必須在可以交換任何數據之前與服務器協商 SSL/TLS 連接。這涉及一個復雜的握手過程,可能會增加請求的大量開銷。

為 HTTP 請求使用連接池可以顯著提高性能。但是,我們需要對其進行適當配置以防止出現災難情況。

什么是連接請求超時?

現在讓我們用連接池的概念再來看問題。

圖片

本例中B組件是外部系統,處于無法建立HTTP連接的情況,導致A中的連接超時,請仔細看上面A指向連接池的箭頭,A 正在等待另一個連接來建立到 B 的 HTTP 連接。

connectionRequestTimeout 是 Spring 中的一個配置參數,用于確定客戶端在超時前等待來自連接池的連接的時間。此超時值用于防止客戶端無限期地等待可能不可用的連接,并在不再需要時釋放連接池中的資源。

API 響應時間 = connectionRequestTimeout? + connectionTimeout? + readTimeout 。

  • connectionRequestTimeout:等待從連接池獲取連接的時間。
  • connectionTimeout:等待與外部組件建立連接的時間。
  • readTimeout:等待外部組件響應的時間。

如何設置connectionRequestTimeout?

connectionRequestTimeout 的默認值為 -1,這意味著它無限期地等待來自連接池的連接。由于我們希望避免外部組件中斷導致系統故障,因此我們需要為其設置一個顯式值。

假設您將值設置得太短:1 秒。如果系統需要高延遲,這可能是一個頻繁的故障,因為它可能一直渴望連接。另一方面,如果該值太長,比如 10 分鐘,系統很容易因外部故障而失敗。

因此,你需要統計系統的API響應時間, 最大超時響應時間如下:

API 響應時間 = connectionRequestTimeout + connectionTimeout + readTimeout。

看看是否有很多請求超過了connectionTimeout和readTimeout?之和, 如果是這樣的話,系統需要增大連接池的大小或者減小connectionRequestTimeout?值。否則就將 connectionRequestTimeout 合理設置為 15 秒到 30 秒之間。

下面是設置 connectionRequestTimeout 的示例代碼。

import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

public class ConnectionRequestTimeoutExample {

public static void main(String[] args) {
RestTemplate restTemplate = new RestTemplate();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
// Set the connectionRequestTimeout value to 10 seconds
requestFactory.setConnectionRequestTimeout(10000);
restTemplate.setRequestFactory(requestFactory);
...
}
}

在這個例子中,我們創建了一個新的RestTemplate?和一個新的HttpComponentsClientHttpRequestFactory?,然后我們connectionRequestTimeout?使用該方法將該值設置為 10 秒,并使用該方法為 RestTemplate? 設置請求工廠setRequestFactory()。

總結

最后,我們在總結以下Spring中Http請求的3個關鍵的超時配置吧,其中connectionRequestTimeout 最容易被忽視的。

  • connectionRequestTimeout:等待從連接池獲取連接的時間
  • connectionTimeout:等待與外部組件建立連接的時間
  • readTimeout:等待外部組件響應的時間
責任編輯:武曉燕 來源: JAVA旭陽
相關推薦

2020-07-06 07:48:16

MySQL細節SQL

2022-07-11 06:56:00

Reactreact-dom

2023-06-02 06:55:04

2020-08-17 09:51:55

.gitignore文件代碼

2015-11-30 17:12:31

Git使用技巧

2015-01-26 17:25:08

應急響應預案企業安全風險

2023-05-06 10:28:14

云計算邊緣計算

2025-05-19 08:10:55

Node.js優化技術

2025-03-28 00:44:00

JavaScript屬性算法

2009-12-01 13:31:49

2021-09-08 22:29:46

Windows 11Windows微軟

2025-06-20 08:14:55

2024-06-27 08:36:12

Lodash對象類型isObject?

2019-11-04 09:32:50

云計算數據中心技術

2024-09-30 08:43:33

HttpgolangTimeout

2019-05-27 13:42:33

Python編程語言代碼

2018-05-10 11:50:13

Docker容器冷知識

2011-05-06 17:43:53

硒鼓

2023-03-16 08:14:57

2020-11-12 08:56:00

AI犯罪記錄人工智能
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一二三四成人免费视频 | 日本一区二区高清视频 | 亚洲热在线视频 | 成人精品国产免费网站 | 亚洲精品粉嫩美女一区 | 91免费版在线观看 | 日韩欧美一区二区三区免费观看 | 天天玩天天干天天操 | 亚洲二区在线 | 极品电影院 | 欧美一级毛片久久99精品蜜桃 | 欧美aaaaaaaaaa| 91久久久久 | 亚洲三区在线 | 天天av天天好逼 | 99re在线视频观看 | 中文字幕av网址 | 蜜桃一区二区三区 | 不卡一区二区三区四区 | 欧美一级片a | 色眯眯视频在线观看 | 国产免费又色又爽又黄在线观看 | 国产精品亚洲成在人线 | 亚洲国产精品91 | 性色av网站 | 看a网站| 亚洲国产成人精品女人 | 欧美a在线看 | 美女福利视频网站 | 亚洲精品一 | 国产精品大片 | 亚洲精彩视频 | 免费黄色的视频 | 亚洲日韩中文字幕一区 | 男女羞羞视频在线看 | 久久精品亚洲精品国产欧美 | 日日操视频| 网站黄色在线免费观看 | 中文字幕不卡一区 | 激情五月激情综合网 | 亚洲国产精品久久久 |