Golang實現超時退出的三種方式

2022-09-24 11:03:12 字數 975 閱讀 1687

前段時間發現線上有個服務介面,總是間歇性告警,有時候一天兩三次,有時候一天都沒有。

告警的邏輯是在乙個介面中非同步呼叫了另乙個http介面,這個http介面呼叫出現超時。但是我去問了負責這個http介面的同學,人家說他們的介面相應都是毫秒級別,還截圖監控了,有圖有真相,我還能說啥。

但是,超時是確實存在的,只是請求還可能沒有到人家服務那邊。

這種偶發性問題不好復現,偶爾來個告警也挺煩的,第一反應還是先解決問題,思路也簡單,失敗後重試。

解決方法

且不談重試策略,先說說什麼時候觸發重試。

我們可以在介面請求出www.cppcns.com錯丟擲err的時候重試,但是這種不好控制,如果乙個請求出去,十來秒都沒有響應,則這個協程就要傻傻的等他報錯才能重試,浪費生命啊~

所以結合上面同學給出的毫秒級響應指標,可以設定乙個超時時間,如果在指定超時時間後沒有返回結果,則重試(這篇重試不是重點)。

func asynccall() ()

select ()

select , 1)

go func(ctx context.context) {

// 傳送http請求

done

1、這裡主要利用通道可以在協程之間通訊的特點,當呼叫成功後,向done通道傳送訊號。

2、監聽done訊號,如果在time.after超時時間之前接收到,則正常返回,否則走向time.after的超時邏輯,執行超時邏輯**。

3、這裡使用的是通道和time.after組合,也可以使用通道和time.newtimer組合。

總結本篇主要介紹如何實現超時控制,主要有三種

1、context.wisrrjbnthtimeout/context.withdeadline + time.after

2、context.withtimeout/context.withdeadline + time.newtimer

3、channel + time.after/time.newtimer

Golang三種方式實現超時退出

前段時間發現線上有個服務介面,總是間歇性告警,有時候一天兩三次,有時候一天都沒有。告警的邏輯是在乙個介面中非同步呼叫了另乙個http介面,這個http介面呼叫出現超時。但是我去問了負責這個http介面的同學,人家說他們的介面相應都是毫秒級別,還截圖監控了,有圖有真相,我還能說啥。但是,超時是確實存在...

HttpClient的三種超時說明

httpclient的三種超時說明 從連線池中取連線的超時時間 connmanagerparams.settimeout params,1000 連線超時 請求超時 第一行設定connectionpooltimeout 這定義了從connectionmanager管理的連線池中取出連線的超時時間,此...

Golang 變數申明的三種方式

golang 申明變數主要有三種方式 一是使用 var 關鍵字,申明包級或函式級變數 二是使用短變數申明方式,只能申明函式級變數,且需指明變數值 三是使用 const 關鍵字,申明包級或函式級常量。1.var var 可以申明包級變數,短變程式設計客棧量申明方式不可以,這是二者最大的區別。var n...