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

使用Go重試機(jī)制代碼更可靠

 更新時間:2022年08月22日 08:56:31   作者:六號積極分子  
這篇文章主要為大家介紹了使用Go重試機(jī)制的使用,使你的代碼更加可靠,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

場景

服務(wù)依賴第三方服務(wù)或者其他服務(wù),但有時第三方服務(wù)偶發(fā)性出現(xiàn)問題并且會快速的恢復(fù),而我們的系統(tǒng)可能因為這些偶發(fā)性出現(xiàn)問題。

所以無法保證以來服務(wù)的可靠性,但是我們可以通過其他的方式來保證我們的服務(wù)是穩(wěn)定的,可靠的。

重試機(jī)制可以協(xié)助我們構(gòu)建健壯的服務(wù)。比如調(diào)用第三方服務(wù)或執(zhí)行某操作時,出現(xiàn)執(zhí)行失敗,我們可以讓其再重試幾次再拋出錯誤。

設(shè)計原理

重試機(jī)制:某方法或者函數(shù)執(zhí)行失敗了重新執(zhí)行,嘗試重新執(zhí)行后,嘗試幾次失敗后結(jié)束。期間成功一次則表示成功。

  • 重試次數(shù)
  • 需要被重新執(zhí)行方法
func add() (string, error) {
    var i = 1
    var j = 2
    result := i + j
    return strconv.Itoa(result), nil
}
func RetryFunc(count int, cback func() (string, error)) {
    for i := 0; i < count; i++ {
        result, err := cback()
        if err == nil {
            return result
        }
    }
}
// 應(yīng)用
package main
func main(){
    Retry(3, add)
}

重試函數(shù)接收2個參數(shù),一個是重試次數(shù),一個是需要重新執(zhí)行的函數(shù)。但函數(shù)都是固定的??梢赃M(jìn)一步優(yōu)化。

type Effector func(context.Context) (string, error)
func Retry(count int ,delay time.Duration, effector){
    return func(ctx. context.Context)(string, error){
        for r:=0; ;r++{
            response, err := effector()
            if err == nil || r>= count {
                return  response, err
             }
            fmt.Printf("Function call failed, retrying in %v", delay)
            select {
                case <- time.After(delay)
                case <- ctx.Done():
                    return "", ctx.Err()
            }
        }
    }
}

增加延時參數(shù) delay 控制重試延時 ,使用匿名函數(shù)定義一個函數(shù)接收器,返回值為匿名函數(shù)的。所以重試函數(shù)接受三個參數(shù):一個效應(yīng)器,一個整數(shù),描述函數(shù)重試傳遞的效應(yīng)器的次數(shù)以及重試之間的延遲。

函數(shù)接收器的參數(shù)是 context ,context 主要用來在 goroutine 之間傳遞上下文信息。這里使用context主要是用于超時取消,然后快速返回。 context包主要提供了兩種方式創(chuàng)建context:

context.Background 是上下文的默認(rèn)值,所有其他的上下文都應(yīng)該從它衍生(Derived)出來。

context.TODO 應(yīng)該只在不確定應(yīng)該使用哪種上下文時使用;

以上就是使用Go重試機(jī)制代碼更可靠的詳細(xì)內(nèi)容,更多關(guān)于Go重試機(jī)制的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語言 channel如何實現(xiàn)歸并排序中的merge函數(shù)詳解

    Go語言 channel如何實現(xiàn)歸并排序中的merge函數(shù)詳解

    這篇文章主要給大家介紹了關(guān)于Go語言 channel如何實現(xiàn)歸并排序中merge函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-02-02
  • Golang中errgroup的常見誤用詳解

    Golang中errgroup的常見誤用詳解

    errgroup和sync.WaitGroup類似,都可以發(fā)起執(zhí)行并等待一組協(xié)程直到所有協(xié)程運行結(jié)束,本文主要為大家整理了一些errgroup的常見誤用,有需要的可以參考下
    2024-01-01
  • golang中make和new的區(qū)別示例詳解

    golang中make和new的區(qū)別示例詳解

    Go 語言中的 new 和 make 一直是新手比較容易混淆的東西,咋一看很相似。不過解釋兩者之間的不同也非常容易,下面這篇文章主要介紹了golang中make和new的區(qū)別,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-08-08
  • Go并發(fā)編程之goroutine使用正確方法

    Go并發(fā)編程之goroutine使用正確方法

    并發(fā)編程有一種常見方式就是許多工作子協(xié)程都是獨立的,互不干擾,但他們又是“同一時間”處理。本文重大給大家介紹Go并發(fā)編程goroutine使用方法,一起看看吧
    2021-09-09
  • 在Go語言項目中使用Zap日志庫的操作過程

    在Go語言項目中使用Zap日志庫的操作過程

    本文將先介紹Go語言原生的日志庫的使用,然后詳細(xì)介紹非常流行的Uber開源的zap日志庫,同時會介紹如何搭配·Lumberjack·實現(xiàn)日志的切割和歸檔,對Go使用Zap日志庫相關(guān)知識感興趣的朋友一起看看吧
    2024-03-03
  • 深入了解Golang?哈希算法之MD5、SHA-1和SHA-256

    深入了解Golang?哈希算法之MD5、SHA-1和SHA-256

    哈希算法是計算機(jī)科學(xué)領(lǐng)域中一種重要的技術(shù),它將任意長度的輸入數(shù)據(jù)映射為固定長度的哈希值,在本篇文章中,我們將深入探討Golang中的哈希算法,從多個方面介紹其詳細(xì)內(nèi)容,希望通過本文的閱讀你將對?Golang哈希算法有更全面的理解
    2023-05-05
  • 三種Golang數(shù)組拷貝的實現(xiàn)方式與性能分析

    三種Golang數(shù)組拷貝的實現(xiàn)方式與性能分析

    在?Golang?中,有多種方式可以進(jìn)行數(shù)組的拷貝,本文將對其中的三種方式進(jìn)行性能分析,并比較它們的優(yōu)缺點,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-06-06
  • go程序部署到linux上運行的實現(xiàn)方法

    go程序部署到linux上運行的實現(xiàn)方法

    本文主要介紹了go程序部署到linux上運行的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 詳解Go語言如何實現(xiàn)二叉樹遍歷

    詳解Go語言如何實現(xiàn)二叉樹遍歷

    這篇文章主要為大家詳解介紹了Go語言中如何實現(xiàn)二叉樹遍歷,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Go語言有一定幫助,需要的可以參考一下
    2022-04-04
  • golang特有程序結(jié)構(gòu)入門教程

    golang特有程序結(jié)構(gòu)入門教程

    GO語言是一門不錯的編程語言能夠到達(dá)靜態(tài)編譯語言的安全和性能,在本文中重點給大家介紹goland特有程序結(jié)構(gòu)及引用類型別名的特征,感興趣的朋友跟隨小編一起看看吧
    2021-06-06

最新評論