欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go實現(xiàn)超時控制的具體使用

 更新時間:2025年08月06日 10:09:28   作者:活椰拿銅  
本文主要介紹了Go中TimeoutControlWrapper實現(xiàn)超時控制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

應(yīng)用場景

交易、金融等事務(wù)系統(tǒng)往往會有各種下游,絕大多數(shù)時候我們會以同步方式進行訪問,如調(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)錯誤,造成用戶體驗的下降。 一種簡易的解決方案是,針對關(guān)鍵的下游節(jié)點增加超時控制。在特定時間內(nèi),如果下游到期還未返回,不再暴露系統(tǒng)級錯誤,而是做特殊化處理,比如返回「處理中」狀態(tài)。

Go實現(xiàn)方案

設(shè)計一個方法,使用閉包,傳入時間和執(zhí)行的任務(wù),如果任務(wù)執(zhí)行完未到時間,則直接返回,否則通知調(diào)用者超時。 為了保證代碼簡介和使用簡單,我們僅定義一個Wrapper方法,方法定義如下 func TimeoutControlWrapper(duration time.Duration, fn func()) (timeout bool)

官方包time有一個After方法,可以在指定時間內(nèi),返回一個channel,基于此來判斷是否超時。 另外,在Wrapper方法里異步化執(zhí)行目標方法,執(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,來實現(xiàn)調(diào)用下游時的超時控制。但在引入的場景里,實現(xiàn)上是不嚴謹?shù)?。哪怕不增加超時控制,我們也無法確認請求是否真實到達了下游系統(tǒng),這本質(zhì)上是一個分布式事務(wù)的問題,需要我們設(shè)計更加健全的系統(tǒng)能力保證一致性,比如通過消息的方式、補償機制、增加對賬系統(tǒng)。

到此這篇關(guān)于Go實現(xiàn)超時控制的具體使用的文章就介紹到這了,更多相關(guān)Go 超時控制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang判斷struct/slice/map是否相等以及對比的方法總結(jié)

    Golang判斷struct/slice/map是否相等以及對比的方法總結(jié)

    平時開發(fā)中對比兩個struct或者map、slice是否相等是經(jīng)常遇到的,有很多對比的方式,比如==,reflect.DeepEqual(),cmp.Equal()等也是經(jīng)常容易混淆的,這么多種對比方式,適用場景和優(yōu)缺點都有哪些呢?今天我們來具體總結(jié)一下,感興趣的小伙伴們可以參考借鑒
    2022-11-11
  • 代碼之美:探索Go語言斷行規(guī)則的奧秘

    代碼之美:探索Go語言斷行規(guī)則的奧秘

    Go語言是一門以簡潔、清晰和高效著稱的編程語言,而斷行規(guī)則是其代碼風格的重要組成部分,通過深入研究Go語言的斷行規(guī)則,我們可以更好地理解和編寫優(yōu)雅的代碼,本文將從語法規(guī)范、代碼風格和最佳實踐等方面進行探討,幫助讀者更好地理解和應(yīng)用Go語言的斷行規(guī)則
    2023-10-10
  • Golang使用panic控制程序錯誤流程

    Golang使用panic控制程序錯誤流程

    這篇文章主要介紹了Golang使用panic控制程序錯誤流程,Golang panic異常處理機制中的一種流程控制方式,用于中斷程序流程并觸發(fā)異常處理
    2023-04-04
  • Go數(shù)據(jù)結(jié)構(gòu)之映射map方式

    Go數(shù)據(jù)結(jié)構(gòu)之映射map方式

    這篇文章主要介紹了Go數(shù)據(jù)結(jié)構(gòu)之映射map方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • go語言調(diào)用其他包中的函數(shù)簡單示例

    go語言調(diào)用其他包中的函數(shù)簡單示例

    這篇文章主要給大家介紹了關(guān)于go語言調(diào)用其他包中的函數(shù)的相關(guān)資料,文中還介紹了Go語言同一個包中不同文件之間函數(shù)調(diào)用的相關(guān)問題,需要的朋友可以參考下
    2023-01-01
  • CSP communicating sequential processes并發(fā)模型

    CSP communicating sequential processes并發(fā)模型

    這篇文章主要為大家介紹了CSP communicating sequential processes并發(fā)模型,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Go中map數(shù)據(jù)類型的實現(xiàn)

    Go中map數(shù)據(jù)類型的實現(xiàn)

    本文介紹了Go語言中的map數(shù)據(jù)類型,用于高效地存儲和管理鍵值對,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-12-12
  • golang?中?channel?的詳細使用、使用注意事項及死鎖問題解析

    golang?中?channel?的詳細使用、使用注意事項及死鎖問題解析

    這篇文章主要介紹了golang?中?channel?的詳細使用、使用注意事項及死鎖分析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • Go基礎(chǔ)教程之環(huán)境搭建及常用命令

    Go基礎(chǔ)教程之環(huán)境搭建及常用命令

    這篇文章主要介紹了Go基礎(chǔ)教程之環(huán)境搭建及常用命令的相關(guān)資料,包括Go語言簡介、環(huán)境配置、包管理工具GoModules以及常用命令的全面介紹,需要的朋友可以參考下
    2025-03-03
  • Go 語言 JSON 標準庫的使用

    Go 語言 JSON 標準庫的使用

    今天通過本文給大家介紹Go 語言 JSON 標準庫的使用小結(jié),包括序列化和反序列化的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧
    2021-10-10

最新評論