慕蓋茨4494581
2023-01-03 11:13:29
我有一個長時間運行的 GO 程序(版本 1.18),它使用 RESTY 每秒同時發送數百個 GET 請求到遠程https://api.abcd.com。每個 GET 請求都是一個單獨的 go-routine,它使用相同的 RESTY 客戶端。遠程服務器https://api.abcd.com是nginx/1.19.2(HTTP/2),IP地址是11.11.11.11和22.22.22.22。是的,這個遠程服務器有多個 IP 地址。我在設置 RESTY 客戶端時使用主機名 SetBaseURL("https://api.abcd.com")傳輸配置是 RESTY 中的默認配置。TraceInfo() 在 RESTY 客戶端啟用。跟蹤信息中有一個“IsConnReused”字段。這個IsConnReused實際上來自于GO httptrace包中的struct GotConnInfo:type GotConnInfo struct { Conn net.Conn // Reused is whether this connection has been previously used for another HTTP request. Reused bool // WasIdle is whether this connection was obtained from anidle pool. WasIdle bool // IdleTime reports how long the connection was previously idle, if WasIdle is true. IdleTime time.Duration}問題 1:GO httptrace 根據主機名(api.abcd.com)或 IP 地址確定“連接重用”?問題2:GO http包空閑連接池其實就是一個map,key是一個struct類型的connectMethodKey。此結構中的地址字段是主機名還是 IP 地址?type connectMethodKey struct { proxy, scheme, addr string onlyH1 bool}這是我在 TraceInfo() 中找到的。程序一開始運行時,所有的請求都發送到11.11.11.11:443。幾分鐘后,所有請求都發送到 22.22.22.22,不再是 11.11.11.11。然后,幾分鐘后,所有請求再次開始發送到 11.11.11.11,這次沒有發送到 22.22.22.22。問題3:當請求開始發送到22.22.22.22時,到11.11.11.11的套接字連接是空閑的,為什么GO http不再使用空閑連接了?我不認為那些空閑連接已經超時。
1 回答

藍山帝景
TA貢獻1843條經驗 獲得超7個贊
問題 1:GO httptrace 根據主機名(api.abcd.com)或 IP 地址確定“連接重用”?
httptrace.GotConnInfo.Reused
跟蹤 TCP 連接是否用于另一個 HTTP 請求。它是每個 IP 地址。
問題2:GO http包空閑連接池其實就是一個map,key是一個struct類型的connectMethodKey。此結構中的地址字段是主機名還是 IP 地址?
addr
是hostname
如果您將請求發送到類似的東西,則可能是一個 IP http://127.0.0.1/
。
問題3:當請求開始發送到22.22.22.22時,到11.11.11.11的套接字連接是空閑的,為什么GO http不再使用空閑連接了?我不認為那些空閑連接已經超時。
如果您使用 HTTP 1,它的工作方式可能會有所不同。有了它,每個請求都需要自己的 TCP 連接。后續請求可能會重用TCP連接,但如果要并行運行請求,則需要建立多個TCP連接。每個連接都會使用不同的 IP 地址,您會看到流量均勻分布。
使用 HTTP/2,單個 TCP 連接可用于多個并行請求。該連接使用單個 IP 地址。
這是 GO 計算新請求是否可以使用開放連接的方式:
使用這些嬰兒車在多個 TCP 連接之間分配流量。
- 1 回答
- 0 關注
- 130 瀏覽
添加回答
舉報
0/150
提交
取消