Go實(shí)現(xiàn)超時控制的具體使用
應(yīng)用場景
交易、金融等事務(wù)系統(tǒng)往往會有各種下游,絕大多數(shù)時候我們會以同步方式進(jìn)行訪問,如調(diào)用RPC、HTTP等。 這些下游在通常延時相對穩(wěn)定,但有時可能出現(xiàn)極端的超大延時,這些極端case可能具備特定的業(yè)務(wù)特征,也有可能單純是硬件、網(wǎng)絡(luò)的問題造成,最終表現(xiàn)在系統(tǒng)P99或者P999的延時出現(xiàn)了突刺,如果是面向C端的場景,也會向用戶報出一些系統(tǒng)錯誤,造成用戶體驗(yàn)的下降。 一種簡易的解決方案是,針對關(guān)鍵的下游節(jié)點(diǎn)增加超時控制。在特定時間內(nèi),如果下游到期還未返回,不再暴露系統(tǒng)級錯誤,而是做特殊化處理,比如返回「處理中」?fàn)顟B(tài)。
Go實(shí)現(xiàn)方案
設(shè)計(jì)一個方法,使用閉包,傳入時間和執(zhí)行的任務(wù),如果任務(wù)執(zhí)行完未到時間,則直接返回,否則通知調(diào)用者超時。 為了保證代碼簡介和使用簡單,我們僅定義一個Wrapper方法,方法定義如下 func TimeoutControlWrapper(duration time.Duration, fn func()) (timeout bool)
官方包time有一個After方法,可以在指定時間內(nèi),返回一個channel,基于此來判斷是否超時。 另外,在Wrapper方法里異步化執(zhí)行目標(biāo)方法,執(zhí)行完成后寫入一個finish信號通知。 同時監(jiān)聽這兩個channel,判斷是否超時,代碼如下
func TimeoutControlWrapper(duration time.Duration, fn func()) (timeout bool) {
finish := make(chan struct{})
go func() {
fn()
finish <- struct{}{}
}()
select {
case <-finish:
return false
case <-time.After(duration):
return true
}
}
結(jié)合場景,假設(shè)系統(tǒng)會調(diào)用一個支付系統(tǒng)的接口,接口本身延時不穩(wěn)定,因此我們套用TimeoutControlWrapper
func CallPaymentSystem(param PayParam) (payStatus PayStatus) {
var payStatus PayStatus
timeout := TimeoutControlWrapper(time.Second, func() {
payStatus = PaymentSystemRPC.Pay(param)
})
if timeout {
warn() // WARN告警
return PROCESSING // 返回處理中
}
return payStatus
}
延伸思考
上述通過一個簡單的Wrapper,來實(shí)現(xiàn)調(diào)用下游時的超時控制。但在引入的場景里,實(shí)現(xiàn)上是不嚴(yán)謹(jǐn)?shù)摹D呐虏辉黾映瑫r控制,我們也無法確認(rèn)請求是否真實(shí)到達(dá)了下游系統(tǒng),這本質(zhì)上是一個分布式事務(wù)的問題,需要我們設(shè)計(jì)更加健全的系統(tǒng)能力保證一致性,比如通過消息的方式、補(bǔ)償機(jī)制、增加對賬系統(tǒng)。
到此這篇關(guān)于Go實(shí)現(xiàn)超時控制的具體使用的文章就介紹到這了,更多相關(guān)Go 超時控制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言編程實(shí)現(xiàn)支持六種級別的日志庫?
這篇文章主要為大家介紹了使用Golang編寫一個支持六種級別的日志庫示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
Golang設(shè)計(jì)模式之單例模式詳細(xì)講解
單例模式很容易記住。就像名稱一樣,它只能提供對象的單一實(shí)例,保證一個類只有一個實(shí)例,并提供一個全局訪問該實(shí)例的方法。本文就來聊聊Go語言中的單例模式,感興趣的小伙伴可以了解一下2023-01-01
Go語言中的自定義函數(shù)類型的實(shí)現(xiàn)
在Go語言中,函數(shù)類型是一種將函數(shù)作為值的數(shù)據(jù)類型,本文主要介紹了Go語言中的自定義函數(shù)類型,具有一定的參考價值,感興趣的可以了解一下2023-09-09

