請求發出後延遲n秒對方才收到的情況問題解決

2021-10-19 13:42:46 字數 2311 閱讀 2023

記一次詭異的生產問題解決思路。

問題描述:

我們的服務需要併發請求服務b的介面,採用定長線程池併發請求,相關工具類使用 resttemplate ,生產上總是出現單次請求用時20秒以上的情況

排查過程:

1、檢查伺服器狀況,發現cpu、記憶體使用率都很低,排除

2、檢查伺服器網路連線情況

netstat -n | awk '/^tcp/  end '
established: 已建立連線

close_wait: 這種狀態的含義其實是表示在等待關閉

time_wait:通訊雙方建立tcp連線後,主動關閉連線的一方就會進入time_wait狀態

未發現異常。

3、抓包分析

sudo tcpdump host 【ip】 -w 【dir】/dump01.pcap
分析工具使用 wireshark

發現目標介面接受到請求時就已經產生延遲了,那麼問題不可能在介面方,只能是網路原因或者請求發出方,生產環境屹立n年不出問題,就不懷疑人家網路的問題了,從自身查起吧~

4、再一次檢查伺服器網路連線情況

雖然close_wait、time_wait數量沒有異常,但突然發現established的數量遠低於併發執行緒數,按理來說達到併發最大值後網路連線數和併發最大數差不多,問題肯定在請求那塊了,因為從現象來看,是請求排隊了,發出了請求,但是對方過了n秒才收到

5、檢查 resttemplate 相關配置**

發現沒有設定最大連線數,扒了扒原始碼,發現預設最大連線數是10,怪不得,若併發50,那還有40個不得等連線空閒了才能輪到它嗎?再一次印證了請求發出後對方延遲n秒才收到的現象。

問題解決:

配置下最大連線數就可以了

@configuration

public class resttemplateconfiguration

}

使用resttemplatebuilder來配置resttemplate bean時,會呼叫配置工廠類方法,此方法追蹤resttemplatebuilder.build() 方法可以找到

private void configurerequestfactory(resttemplate resttemplate) 

else if (this.detectrequestfactory)

if (requestfactory != null)

resttemplate.setrequestfactory(requestfactory);

} }

如果你沒顯示指定requestfactory類,那麼它會呼叫detectrequestfactory()

}這塊**作用就是看你引用的包裡有沒有 request_factory_candidates 裡設定的相關工廠類,有的話就預設使用了,沒有的話就用******clienthttprequestfactory 了。

看下request_factory_candidates裡的東西都是啥:

private static final maprequest_factory_candidates;

static

在這個專案裡是用org.springframework.http.client.httpcomponentsclienthttprequestfactory 了 

httpcomponentsclienthttprequestfactory在構建物件時如果不傳參,執行如下**:

public httpcomponentsclienthttprequestfactory()
public static closeablehttpclient createsystem()
可以看到,會使用httpclientbuilder預設配置,進一步探查**發現:

if (systemproperties) 

}

預設最大連線數是10,所以我們改一下就可以了。

其底層是通過apache 的httpclient實現了連線池

參考:

php 發出get與post請求

3.1 get方式實現 初始化 ch curl init 設定選項,包括 urlcurl setopt ch,curlopt url,curl setopt ch,curlopt returntransfer,1 curl setopt ch,curlopt header,0 執行並獲取 html ...

vue 發出請求時帶token

目前我用的介面都是前期不需要token。所以我先把token寫死 1 首先安裝axios npm install axios2 在main.js中引入axios import axios from axios vue.prototype.axios axios3 在main,js中引入token 加...

python 寫完程式後發出報警

在windows上 import winsound duration 1000 millisecond freq 440 hz winsound.beep freq,duration 其中,freq是頻率 以赫茲為單位 而持續時間是毫秒 毫秒 在linux 和mac 上 import os dura...