自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Spring項(xiàng)目不要忽視這個(gè)超時(shí)配置,否則你的Http調(diào)用可能無(wú)法結(jié)束

開(kāi)發(fā) 項(xiàng)目管理
我們?cè)诳偨Y(jié)以下Spring中Http請(qǐng)求的3個(gè)關(guān)鍵的超時(shí)配置吧,其中connectionRequestTimeout 最容易被忽視的。

?前言

不知道你有沒(méi)有過(guò)這樣的經(jīng)歷,你的Spring項(xiàng)目通過(guò)http接口遠(yuǎn)程調(diào)用外部系統(tǒng)時(shí),通常你會(huì)設(shè)置超時(shí)時(shí)間,比如5秒鐘,但是實(shí)際情況卻是由于外部系統(tǒng)出現(xiàn)故障并導(dǎo)致連接超時(shí),有些請(qǐng)求花費(fèi)遠(yuǎn)遠(yuǎn)超過(guò)5秒時(shí)間,甚至1分鐘,這直接導(dǎo)致你本身的接口響應(yīng)很慢,如果訪問(wèn)你接口的流量很大的話,甚至拖垮你的系統(tǒng),這將會(huì)是災(zāi)難性的后果。

圖片

你可能會(huì)好奇到底是什么原因?qū)е碌模芸赡苁悄愫雎粤诉@個(gè)超時(shí)配置項(xiàng)connectionRequestTimeout導(dǎo)致的。

Spring中的連接池

在深入了解 connectionRequestTimeout 之前,我們需要了解外部 HTTP 請(qǐng)求是如何在 Spring 中進(jìn)行的。

圖片

Spring 通過(guò)Http調(diào)用外部系統(tǒng)的時(shí)候,會(huì)使用連接池去管理他們。因?yàn)镠TTP請(qǐng)求創(chuàng)建連接代價(jià)比較高,而連接池可以做到連接的復(fù)用,回過(guò)頭,我們思考下為什么會(huì)代價(jià)高呢?

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

為 HTTP 請(qǐng)求使用連接池可以顯著提高性能。但是,我們需要對(duì)其進(jìn)行適當(dāng)配置以防止出現(xiàn)災(zāi)難情況。

什么是連接請(qǐng)求超時(shí)?

現(xiàn)在讓我們用連接池的概念再來(lái)看問(wèn)題。

圖片

本例中B組件是外部系統(tǒng),處于無(wú)法建立HTTP連接的情況,導(dǎo)致A中的連接超時(shí),請(qǐng)仔細(xì)看上面A指向連接池的箭頭,A 正在等待另一個(gè)連接來(lái)建立到 B 的 HTTP 連接。

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

API 響應(yīng)時(shí)間 = connectionRequestTimeout? + connectionTimeout? + readTimeout 。

  • connectionRequestTimeout:等待從連接池獲取連接的時(shí)間。
  • connectionTimeout:等待與外部組件建立連接的時(shí)間。
  • readTimeout:等待外部組件響應(yīng)的時(shí)間。

如何設(shè)置connectionRequestTimeout?

connectionRequestTimeout 的默認(rèn)值為 -1,這意味著它無(wú)限期地等待來(lái)自連接池的連接。由于我們希望避免外部組件中斷導(dǎo)致系統(tǒng)故障,因此我們需要為其設(shè)置一個(gè)顯式值。

假設(shè)您將值設(shè)置得太短:1 秒。如果系統(tǒng)需要高延遲,這可能是一個(gè)頻繁的故障,因?yàn)樗赡芤恢笨释B接。另一方面,如果該值太長(zhǎng),比如 10 分鐘,系統(tǒng)很容易因外部故障而失敗。

因此,你需要統(tǒng)計(jì)系統(tǒng)的API響應(yīng)時(shí)間, 最大超時(shí)響應(yīng)時(shí)間如下:

API 響應(yīng)時(shí)間 = connectionRequestTimeout + connectionTimeout + readTimeout。

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

下面是設(shè)置 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);
...
}
}

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

總結(jié)

最后,我們?cè)诳偨Y(jié)以下Spring中Http請(qǐng)求的3個(gè)關(guān)鍵的超時(shí)配置吧,其中connectionRequestTimeout 最容易被忽視的。

  • connectionRequestTimeout:等待從連接池獲取連接的時(shí)間
  • connectionTimeout:等待與外部組件建立連接的時(shí)間
  • readTimeout:等待外部組件響應(yīng)的時(shí)間
責(zé)任編輯:武曉燕 來(lái)源: JAVA旭陽(yáng)
相關(guān)推薦

2022-07-11 06:56:00

Reactreact-dom

2023-06-02 06:55:04

2020-07-06 07:48:16

MySQL細(xì)節(jié)SQL

2020-08-17 09:51:55

.gitignore文件代碼

2015-11-30 17:12:31

Git使用技巧

2021-09-08 22:29:46

Windows 11Windows微軟

2023-05-06 10:28:14

云計(jì)算邊緣計(jì)算

2015-01-26 17:25:08

應(yīng)急響應(yīng)預(yù)案企業(yè)安全風(fēng)險(xiǎn)

2009-12-01 13:31:49

2025-03-28 00:44:00

JavaScript屬性算法

2024-09-30 08:43:33

HttpgolangTimeout

2024-06-27 08:36:12

Lodash對(duì)象類型isObject?

2019-05-27 13:42:33

Python編程語(yǔ)言代碼

2018-05-10 11:50:13

Docker容器冷知識(shí)

2023-03-16 08:14:57

2019-11-04 09:32:50

云計(jì)算數(shù)據(jù)中心技術(shù)

2024-03-08 10:05:09

SpringHTTP接口

2020-11-12 08:56:00

AI犯罪記錄人工智能

2023-09-25 14:54:13

2011-05-06 17:43:53

硒鼓
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)