使用Go重試機(jī)制代碼更可靠
場景
服務(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ù)詳解
這篇文章主要給大家介紹了關(guān)于Go語言 channel如何實現(xiàn)歸并排序中merge函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-02-02深入了解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?中,有多種方式可以進(jìn)行數(shù)組的拷貝,本文將對其中的三種方式進(jìn)行性能分析,并比較它們的優(yōu)缺點,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-06-06