使用Go重試機(jī)制代碼更可靠
場(chǎng)景
服務(wù)依賴第三方服務(wù)或者其他服務(wù),但有時(shí)第三方服務(wù)偶發(fā)性出現(xiàn)問(wèn)題并且會(huì)快速的恢復(fù),而我們的系統(tǒng)可能因?yàn)檫@些偶發(fā)性出現(xiàn)問(wèn)題。
所以無(wú)法保證以來(lái)服務(wù)的可靠性,但是我們可以通過(guò)其他的方式來(lái)保證我們的服務(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ù)都是固定的??梢赃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í)參數(shù) delay 控制重試延時(shí) ,使用匿名函數(shù)定義一個(gè)函數(shù)接收器,返回值為匿名函數(shù)的。所以重試函數(shù)接受三個(gè)參數(shù):一個(gè)效應(yīng)器,一個(gè)整數(shù),描述函數(shù)重試傳遞的效應(yīng)器的次數(shù)以及重試之間的延遲。
函數(shù)接收器的參數(shù)是 context ,context 主要用來(lái)在 goroutine 之間傳遞上下文信息。這里使用context主要是用于超時(shí)取消,然后快速返回。 context包主要提供了兩種方式創(chuàng)建context:
context.Background 是上下文的默認(rèn)值,所有其他的上下文都應(yīng)該從它衍生(Derived)出來(lái)。
context.TODO 應(yīng)該只在不確定應(yīng)該使用哪種上下文時(shí)使用;
以上就是使用Go重試機(jī)制代碼更可靠的詳細(xì)內(nèi)容,更多關(guān)于Go重試機(jī)制的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Golang處理gRPC請(qǐng)求/響應(yīng)元數(shù)據(jù)的示例代碼
前段時(shí)間實(shí)現(xiàn)內(nèi)部gRPC框架時(shí),為了實(shí)現(xiàn)在服務(wù)端攔截器中打印請(qǐng)求及響應(yīng)的頭部信息,便查閱了部分關(guān)于元數(shù)據(jù)的資料,因?yàn)橹形木W(wǎng)絡(luò)上對(duì)于該領(lǐng)域的信息較少,于是在這做了一些簡(jiǎn)單的總結(jié),需要的朋友可以參考下2024-03-03
Golang高性能持久化解決方案BoltDB數(shù)據(jù)庫(kù)介紹
這篇文章主要為大家介紹了Golang高性能持久化解決方案BoltDB數(shù)據(jù)庫(kù)介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11
Golang學(xué)習(xí)筆記(一):簡(jiǎn)介
這篇文章主要介紹了Golang學(xué)習(xí)筆記(一):簡(jiǎn)介,本文講解了Go語(yǔ)言最主要的特性、安裝、環(huán)境變量設(shè)置、整體目錄結(jié)構(gòu)、Helloworld、go命令、調(diào)試、編輯器設(shè)置等內(nèi)容,需要的朋友可以參考下2015-05-05
詳解Go語(yǔ)言中切片的長(zhǎng)度與容量的區(qū)別
切片可以看成是數(shù)組的引用,切片的長(zhǎng)度是它所包含的元素個(gè)數(shù)。切片的容量是從它的第一個(gè)元素到其底層數(shù)組元素末尾的個(gè)數(shù)。本文將通過(guò)示例詳細(xì)講講Go語(yǔ)言中切片的長(zhǎng)度與容量的區(qū)別,需要的可以參考一下2022-11-11
Go多線程中數(shù)據(jù)不一致問(wèn)題的解決方案(sync鎖機(jī)制)
在Go語(yǔ)言的并發(fā)編程中,如何確保多個(gè)goroutine安全地訪問(wèn)共享資源是一個(gè)關(guān)鍵問(wèn)題,Go語(yǔ)言提供了sync包,其中包含了多種同步原語(yǔ),用于解決并發(fā)編程中的同步問(wèn)題,本文將詳細(xì)介紹sync包中的鎖機(jī)制,需要的朋友可以參考下2024-10-10
GoLang BoltDB數(shù)據(jù)庫(kù)詳解
這篇文章主要介紹了GoLang BoltDB數(shù)據(jù)庫(kù),boltdb是使用Go語(yǔ)言編寫(xiě)的開(kāi)源的鍵值對(duì)數(shù)據(jù)庫(kù),boltdb存儲(chǔ)數(shù)據(jù)時(shí) key和value都要求是字節(jié)數(shù)據(jù),此處需要使用到 序列化和反序列化2023-02-02
源碼剖析Golang中singleflight的應(yīng)用
這篇文章主要為大家詳細(xì)介紹了如何利用singleflight來(lái)避免緩存擊穿,并剖析singleflight包的源碼實(shí)現(xiàn)和工作原理,感興趣的可以了解下2024-03-03

