hystrix-go 簡介
【導讀】對服務可用性需求高的場景中可能使用 hystrix 作爲限流器,本文介紹了 go 項目中 hystrix 的基本使用方案。
hystrix 是一個容錯庫,旨在隔離指向遠程系統,服務和第三方庫的請求,杜絕級聯故障,並在複雜的分佈式系統中實現彈性,畢竟在分佈式系統中,故障是不可避免的。
此項目脫胎於由 Netflix 開源的同名 java 項目。https://github.com/Netflix/Hystrix
像 Hystrix 命令一樣執行代碼
定義依賴於外部系統的應用邏輯,將函數傳給 Go。當外部系統處於健康狀態,這個函數將是唯一被執行的代碼。
hystrix.Go("my_command", func() error {
// talk to other services
return nil
}, nil)
定義 fallback 行爲
如果希望外部系統掛了的時候執行一些動作,可以給 Go 傳遞第二個函數。理想情況下,這裏的邏輯可以讓你的應用優雅地處理外部系統不可用的情況。
當第一個函數返回 error,或者在一系列健康檢查的情況下函數無法運行結束,都會觸發 fallback。更詳細的參考在這裏
hystrix.Go("my_command", func() error {
// talk to other services
return nil
}, func(err error) error {
// do this when services are down
return nil
})
等待輸出
調用 Go 就像執行了一個 goroutine,除了你能獲取到一個 error 的 channel 並且監控它。
output := make(chan bool, 1)
errors := hystrix.Go("my_command", func() error {
// talk to other services
output <- true
return nil
}, nil)
select {
case out := <-output:
// success
case err := <-errors:
// failure
}
同步 API
調用一個藉口並且等待返回是一個常見的場景(對應於 goroutine),Hystrix 提供了一個 Do 函數,返回一個 error
err := hystrix.Do("my_command", func() error {
// talk to other services
return nil
}, nil)
配置
在應用啓動期間,你可以調用 ConfigureCommand 來爲每個 command 添加配置:
hystrix.ConfigureCommand("my_command", hystrix.CommandConfig{
Timeout: 1000,
MaxConcurrentRequests: 100,
ErrorPercentThreshold: 25,
})
也有別的配置方法,更詳細的介紹請參考官方文檔。
一個例子
最後給大家舉個例子
package main
import (
"fmt"
"github.com/afex/hystrix-go/hystrix"
"net/http"
"time"
)
func main() {
hystrix.Go("get_baidu", func() error {
// talk to other services
_, err := http.Get("https://www.baidu.com/")
if err != nil {
fmt.Println("get error")
return err
}
return nil
}, func(err error) error {
fmt.Println("get an error, handle it")
return nil
})
time.Sleep(2 * time.Second) // 調用Go方法就是起了一個goroutine,這裏要sleep一下,不然看不到效果
}
網絡請求,大家把網絡斷開後就能夠模擬外部服務掛掉的情況。
總結
熔斷機制在分佈式系統中幾乎是必備的組件,下面總結一下:
特點
-
hystrix 作用在客戶端,客戶端程序依賴 hystrix 相關的第三方包,使得客戶端與所依賴的服務,形成隔離 (goroutine 的隔離)。依賴服務的延遲與失敗變的可控。保護調用者 goroutine 的執行。
-
避免了分佈式系統中,單個組件的失敗導致的級聯影響。
-
快速失敗,迅速恢復。hystrix 有快速失敗機制,單個組件服務失敗率到一定程度後,再請求,會直接響應失敗。再這之後,會有重試機制。減少系統在錯誤服務調用上的開銷。
-
降級應用
hystrix 的設計原則
-
防止任何單個依賴服務耗盡所有用戶線程
-
直接響應失敗,而不是一直等待
-
提供錯誤返回接口,而不是讓用戶線程直接處理依賴服務拋出的異常
-
使用隔離或熔斷技術來降低並限制單個依賴對整個系統造成的影響
轉自:youmai
michaelyou.github.io/2017/11/27/hystrix-go%E7%AE%80%E4%BB%8B/
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/FcB2gupi7ClrxZvoscziDg