使用Go重試機(jī)制代碼更可靠
場(chǎng)景
服務(wù)依賴第三方服務(wù)或者其他服務(wù),但有時(shí)第三方服務(wù)偶發(fā)性出現(xiàn)問題并且會(huì)快速的恢復(fù),而我們的系統(tǒng)可能因?yàn)檫@些偶發(fā)性出現(xiàn)問題。
所以無法保證以來服務(wù)的可靠性,但是我們可以通過其他的方式來保證我們的服務(wù)是穩(wěn)定的,可靠的。
重試機(jī)制可以協(xié)助我們構(gòu)建健壯的服務(wù)。比如調(diào)用第三方服務(wù)或執(zhí)行某操作時(shí),出現(xiàn)執(zhí)行失敗,我們可以讓其再重試幾次再拋出錯(cuò)誤。
設(shè)計(jì)原理
重試機(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個(gè)參數(shù),一個(gè)是重試次數(shù),一個(gè)是需要重新執(zhí)行的函數(shù)。但函數(shù)都是固定的。可以進(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í)參數(shù) delay 控制重試延時(shí) ,使用匿名函數(shù)定義一個(gè)函數(shù)接收器,返回值為匿名函數(shù)的。所以重試函數(shù)接受三個(gè)參數(shù):一個(gè)效應(yīng)器,一個(gè)整數(shù),描述函數(shù)重試傳遞的效應(yīng)器的次數(shù)以及重試之間的延遲。
函數(shù)接收器的參數(shù)是 context ,context 主要用來在 goroutine 之間傳遞上下文信息。這里使用context主要是用于超時(shí)取消,然后快速返回。 context
包主要提供了兩種方式創(chuàng)建context
:
context.Background
是上下文的默認(rèn)值,所有其他的上下文都應(yīng)該從它衍生(Derived)出來。
context.TODO
應(yīng)該只在不確定應(yīng)該使用哪種上下文時(shí)使用;
以上就是使用Go重試機(jī)制代碼更可靠的詳細(xì)內(nèi)容,更多關(guān)于Go重試機(jī)制的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go語言 channel如何實(shí)現(xiàn)歸并排序中的merge函數(shù)詳解
這篇文章主要給大家介紹了關(guān)于Go語言 channel如何實(shí)現(xiàn)歸并排序中merge函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-02-02深入了解Golang?哈希算法之MD5、SHA-1和SHA-256
哈希算法是計(jì)算機(jī)科學(xué)領(lǐng)域中一種重要的技術(shù),它將任意長度的輸入數(shù)據(jù)映射為固定長度的哈希值,在本篇文章中,我們將深入探討Golang中的哈希算法,從多個(gè)方面介紹其詳細(xì)內(nèi)容,希望通過本文的閱讀你將對(duì)?Golang哈希算法有更全面的理解2023-05-05三種Golang數(shù)組拷貝的實(shí)現(xiàn)方式與性能分析
在?Golang?中,有多種方式可以進(jìn)行數(shù)組的拷貝,本文將對(duì)其中的三種方式進(jìn)行性能分析,并比較它們的優(yōu)缺點(diǎn),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-06-06go程序部署到linux上運(yùn)行的實(shí)現(xiàn)方法
本文主要介紹了go程序部署到linux上運(yùn)行的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04