日韩欧美人妻无码精品白浆,www.大香蕉久久网,狠狠的日狠狠的操,日本好好热在线观看

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

http請求超時, 底層發(fā)生了什么?

freeflydom
2024年12月5日 9:15 本文熱度 1443

業(yè)務方反應調(diào)用接口超時,但是在服務端監(jiān)控并沒有看到5xx異常, 于是我們模擬一下請求超時時發(fā)生了什么?

1.openresty模擬長耗時服務端

延遲5s響應


error_log logs/error.log;



http {

   server {

     listen 80;

     charset  utf-8;



     location /reqtimeout {

     default_type text/html;

     content_by_lua '

     local  start  = os.clock()

         while os.clock() - start  <  5 do  end

           ngx.say("delay  success!!")

     ';

   }

 }  

}

2.golang和.net默認的httpclient對外都只有一個timeout設置

用于控制請求、響應的整體時間

.net httpclient 默認timeout= 100s;
golang net/http 無默認值設置,強烈推薦設置timeout,以避免服務端慢響應拖垮客戶端。


 static void Main(string[] args)

   {

       Console.WriteLine("Hello, World!");

      var a =  HttpReqTimeout();

      Console.WriteLine(a.Result);

   }



   static async  Task<string> HttpReqTimeout()

   {

       var handler = new SocketsHttpHandler

       {

           PooledConnectionLifetime = TimeSpan.FromMinutes(1)

       };

       using (var hc = new HttpClient(handler))

       {

           hc.Timeout = TimeSpan.FromSeconds(3);

           return  await hc.GetStringAsync("http://localhost/reqtimeout");

       }

   }

dotnet run ./ 顯示客戶端請求3s超時,爆出異常


Hello, World!

Unhandled exception. System.AggregateException: One or more errors occurred. (A task was canceled.)

---> System.Threading.Tasks.TaskCanceledException: A task was canceled.

  at System.Threading.Tasks.Task.GetExceptions(Boolean includeTaskCanceledExceptions)

  at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)

  at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)

  at ConsoleApp1.Program.Main(String[] args) in /Users/admin/RiderProjects/TestHttpClientFactory/ConsoleApp1/Program.cs:line 9

--- End of stack trace from previous location ---



  --- End of inner exception stack trace ---

  at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)

  at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)

  at ConsoleApp1.Program.Main(String[] args) in /Users/admin/RiderProjects/TestHttpClientFactory/ConsoleApp1/Program.cs:line 9

openresty服務端日志,顯示執(zhí)行完成,返回200ok:


127.0.0.1 - - [04/Dec/2024:15:17:50 +0800] "GET /reqtimeout HTTP/1.1" 200 28 "-" "-"

這也正是對應上了業(yè)務方的反饋和服務端的監(jiān)控現(xiàn)象(無5xx報錯)。

3.wireshark抓包看實質(zhì)

tcp.port == 80 && ip.addr ==127.0.0.1 && ip.dst ==127.0.0.1

從tcp抓包過程看,分為三階段:

1>. httpclient請求, 正常tcp三次握手+ 請求確認;
2>. 客戶端3s之后超時, 客戶端發(fā)送FIN+ACK 數(shù)據(jù)包(客戶端標記連接已經(jīng)被關閉), 服務端確認收到客戶端的FIN包;
3>. 服務端5s嘗試響應給客戶端,最終會檢測到客戶端已經(jīng)關閉而釋放資源。

也就是說客戶端請求超時,只會影響客戶端, 服務端還會繼續(xù)處理并響應, 這也是我們在服務端監(jiān)控上看不到5xx報錯的原因,可以通過在服務端設置: request_time between (-xx, 3s) 監(jiān)測請求耗時占比。

正常的請求/響應讀者可以參考下圖:

4. 服務端能感知到客戶端請求超時嗎 ?

客戶端請求超時, 默認情況下服務端都是繼續(xù)執(zhí)行之后響應;

服務器是具備感知客戶端請求取消的能力的。

C# 是通過CancellationToken,感知客戶端取消,之后服務端可以做一些邏輯,比如記錄客戶端請求超時(常規(guī)實踐是記錄408響應碼)


// 在控制器/服務獲取到當前請求的上下文,通過token感知到客戶端取消,

var cancellationToken = httpContext.RequestAborted;

await LongLoop(cancellationToken);





public Task LongLoop(CancellationToken  token)

{

   while(true)

   {

       if  (token.IsCancellationRequested == true)

       {

           break;

       }

       //---  長耗時循環(huán)

   }



   return Task.CompletedTask;

}

golang 是通過request.Context獲取客戶端取消信號,內(nèi)核類似于C#


func getHello(w http.ResponseWriter, r *http.Request) {

       ctx := r.Context()

       select {

       case <-ctx.Done():

              // 如果請求已取消或超時,這里會被觸發(fā)

              err := ctx.Err()

              fmt.Println("Request cancelled:", err)

              return

       case <-time.After(5 * time.Second):

              io.WriteString(w, "Hello, HTTP!\n")

              return

       }

}

本文記錄了httpclient客戶端超時在雙端的現(xiàn)象, 服務端會繼續(xù)響應,在服務端可能檢測不到客戶端認定的報錯, 經(jīng)驗無他,唯手熟爾。

轉自https://www.cnblogs.com/JulianHuang/p/18586745


該文章在 2024/12/5 10:13:27 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務費用、相關報表等業(yè)務管理,結合碼頭的業(yè)務特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

日韩欧美黄片特级| 日韩无码 91大神| 婷日本色婷婷| 国产国产国产国产国产| 国内免费视频一区二区老师| 亚州免费一区| 蜜臂AV电影| 亚洲黄色片久久久| 91美女专区| 国产亚洲精品夜夜夜妓女网97| 色妺妺视频网| 麻豆视屏一区二区三区| 在线18视频| 日韩欧美乱伦无码| 极品少妇诱惑成人网站| AV在线新地址| 黄色一久久一热| 97caoporn超碰在线观看| 蜜臀不卡在线| 偷拍网亚洲| 综合激情欧美视频| 在线少妇人妻你懂得| 国产黄色大片久久| 欧美午夜日韩色欲| 欧美 偷拍自拍干| 乱乱伦色一区| 久久入口一区二区三区| 中文网天堂资源av在线| 精品久久久久久久人妻无码中文| 99热精品一区| 激情91av| 美女禁1区精品视频在线看| 操老太太骚逼综合网站| 免费+无码+国产精品| 天堂a在线地址16新版本| 亚洲精品995083| 欧美图片亚州无码一区二区三区| 图片区,视频区,无码区| 欧美熟妻六区七区八区| 人妻无码第一页| 国产 精品一区二区三区射|