直播系統原始碼,利用重試機制保證服務穩定性

zhibo系統開發發表於2024-01-06

場景

在直播系統原始碼中有些服務依賴第三方服務或者其他服務,但有時第三方服務偶發性出現問題並且會快速的恢復,而直播系統原始碼可能因為這些偶發性出現問題。所以無法保證以來服務的可靠性,但是我們可以透過其他的方式來保證我們的服務是穩定的,可靠的。
重試機制可以協助我們構建健壯的直播系統原始碼服務。比如呼叫第三方服務或執行某操作時,出現執行失敗,我們可以讓其再重試幾次再丟擲錯誤。

設計原理

重試機制:某方法或者函式執行失敗了重新執行,嘗試重新執行後,嘗試幾次失敗後結束。期間成功一次則表示成功。

重試次數
需要被重新執行方法

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
        }
    }
}
// 應用
package main
func main(){
    Retry(3, add)
}

重試函式接收2個引數,一個是重試次數,一個是需要重新執行的函式。但函式都是固定的。可以進一步最佳化。

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()
            }
        }
    }
}

增加延時引數 delay 控制重試延時 ,使用匿名函式定義一個函式接收器,返回值為匿名函式的。所以重試函式接受三個引數:一個效應器,一個整數,描述函式重試傳遞的效應器的次數以及重試之間的延遲。
函式接收器的引數是 context ,context 主要用來在 goroutine 之間傳遞上下文資訊。這裡使用context主要是用於超時取消,然後快速返回。
context包主要提供了兩種方式建立context:

context.Background 是上下文的預設值,所有其他的上下文都應該從它衍生(Derived)出來。
context.TODO 應該只在不確定應該使用哪種上下文時使用;

以上就是直播系統原始碼,利用重試機制保證服務穩定性, 更多內容歡迎關注之後的文章


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/69978258/viewspace-3002919/,如需轉載,請註明出處,否則將追究法律責任。

相關文章