參考:
[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 { //記錄一下 } })
