最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

場(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ù)的示例代碼

    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
  • go語(yǔ)言中的map如何解決散列性能下降

    go語(yǔ)言中的map如何解決散列性能下降

    近期對(duì)go語(yǔ)言的map進(jìn)行深入了解和探究,其中關(guān)于map解決大量沖突的擴(kuò)容操作設(shè)計(jì)的十分巧妙,所以筆者特地整理了這篇文章來(lái)探討一下go語(yǔ)言中map如何解決散列性能下降,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2024-03-03
  • Golang高性能持久化解決方案BoltDB數(shù)據(jù)庫(kù)介紹

    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)介

    這篇文章主要介紹了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ū)別

    詳解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多線程中數(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
  • Go字符串操作深入解析

    Go字符串操作深入解析

    這篇文章主要為大家介紹了Go字符串操作深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • GoLang BoltDB數(shù)據(jù)庫(kù)詳解

    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
  • GO的range如何使用詳解

    GO的range如何使用詳解

    本文主要介紹了GO的range如何使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 源碼剖析Golang中singleflight的應(yīng)用

    源碼剖析Golang中singleflight的應(yīng)用

    這篇文章主要為大家詳細(xì)介紹了如何利用singleflight來(lái)避免緩存擊穿,并剖析singleflight包的源碼實(shí)現(xiàn)和工作原理,感興趣的可以了解下
    2024-03-03

最新評(píng)論

邵阳市| 怀化市| 衢州市| 通榆县| 承德市| 济源市| 茂名市| 抚州市| 北海市| 福海县| 光山县| 长治市| 大石桥市| 昭通市| 静宁县| 印江| 南城县| 华安县| 鸡泽县| 保山市| 兰考县| 海宁市| 乐陵市| 辉南县| 南澳县| 南充市| 枣阳市| 惠州市| 邵武市| 保康县| 陈巴尔虎旗| 秀山| 漳州市| 大英县| 左云县| 新建县| 白城市| 介休市| 库伦旗| 怀化市| 佳木斯市|