前段時間發現線上有個服務介面,總是間歇性告警,有時候一天兩三次,有時候一天都沒有。
告警的邏輯是在乙個介面中非同步呼叫了另乙個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...