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一下,不然看不到效果
}

網絡請求,大家把網絡斷開後就能夠模擬外部服務掛掉的情況。

總結

熔斷機制在分佈式系統中幾乎是必備的組件,下面總結一下:

特點

  1. hystrix 作用在客戶端,客戶端程序依賴 hystrix 相關的第三方包,使得客戶端與所依賴的服務,形成隔離 (goroutine 的隔離)。依賴服務的延遲與失敗變的可控。保護調用者 goroutine 的執行。

  2. 避免了分佈式系統中,單個組件的失敗導致的級聯影響。

  3. 快速失敗,迅速恢復。hystrix 有快速失敗機制,單個組件服務失敗率到一定程度後,再請求,會直接響應失敗。再這之後,會有重試機制。減少系統在錯誤服務調用上的開銷。

  4. 降級應用

hystrix 的設計原則

  1. 防止任何單個依賴服務耗盡所有用戶線程

  2. 直接響應失敗,而不是一直等待

  3. 提供錯誤返回接口,而不是讓用戶線程直接處理依賴服務拋出的異常

  4. 使用隔離或熔斷技術來降低並限制單個依賴對整個系統造成的影響

轉自:youmai

michaelyou.github.io/2017/11/27/hystrix-go%E7%AE%80%E4%BB%8B/

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/FcB2gupi7ClrxZvoscziDg