go筆記-熔斷器


參考:

[1] https://studygolang.com/articles/13254

[2] https://blog.luojilab.com/2019/12/16/zeroteam/You_have_to_know_the_rate_limit_of_the_series/ 

[3] https://www.cnblogs.com/li-peng/p/11050563.html

區別:(限速器 VS 熔斷器)

限速器(limiter)可以限制接口自身被調的頻率

熔斷器可監控所調用的服務的失敗、超時情況,當依賴的下游服務失敗過高時,熔斷器開啟,不再調用下游服務,轉向降級策略,從而避免雪崩。

文章[2]中:限流與熔斷經常被人弄混,它們最大的區別在於限流主要在server實現,而熔斷主要在client實現

熔斷器有三種狀態:

  • 關閉狀態:服務正常,並維護一個失敗率統計,當失敗率達到閥值時,轉到開啟狀態
  • 開啟狀態:服務異常,調用 fallback 函數,一段時間之后,進入半開啟狀態
  • 半開啟裝態:嘗試恢復服務,失敗率高於閥值,進入開啟狀態,低於閥值,進入關閉狀態

github.com/afex/hystrix-go,提供了 go 熔斷器實現,使用上面也很方便,首先創建一個熔斷器

hystrix.ConfigureCommand(
    "addservice", // 熔斷器名字,可以用服務名稱命名,一個名字對應一個熔斷器,對應一份熔斷策略
    hystrix.CommandConfig{
        Timeout:                100,  // 超時時間 100ms
        MaxConcurrentRequests:  2,    // 最大並發數,超過並發返回錯誤
        RequestVolumeThreshold: 4,    // 請求數量的閥值,用這些數量的請求來計算閥值,熔斷器是否打開要滿足這個條件;這里的設置表示至少有4個請求才進行ErrorPercentThreshold錯誤百分比計算
        ErrorPercentThreshold:  25,   // 錯誤率閥值,百分比。達到閥值,啟動熔斷
        SleepWindow:            1000, // 熔斷嘗試恢復時間,單位毫秒
    },
)

 

例子:

// SV熔斷器
hystrix.ConfigureCommand(
    "SV",
    hystrix.CommandConfig{
        Timeout:                200,          // 超時時間 200ms
        MaxConcurrentRequests:  500,      // 最大並發數,超過並發返回錯誤
        RequestVolumeThreshold: 100, 
        ErrorPercentThreshold:  3,
        SleepWindow:            1000
    },
)

 

//hystrix.GetCircuit: 獲取這次執行的breaker,測試時使用,查看斷路器的狀態
brker, _, _ := hystrix.GetCircuit("SV")
err := hystrix.Do("SV", func() error {
    //正常處理
}, func(err error) error {
    //兜底處理   
    if brker.AllowRequest() == false {
        //記錄一下
    }
})

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM