【问题标题】:golang's hystrix library "circuit open" without "timeout" errorgolang 的 hystrix 库“电路打开”没有“超时”错误
【发布时间】:2020-04-13 13:37:30
【问题描述】:

我们将 hystrix 用于我们的 golang 应用程序,这里我们得到 hystrix: circuit open 错误,即使没有 hystrix: timeout

hystrix 配置:

hystrix.ConfigureCommand(cmd, hystrix.CommandConfig{
        Timeout:               timeout,
        MaxConcurrentRequests: 1000,
        ErrorPercentThreshold: 5,
        SleepWindow:           15 * 60 * 1000, //15 Minutes
    })

在 hystrix 后备部分,我们记录错误消息信息。我们可以清楚地看到我们只有 hystrix: circuit open 错误,没有任何其他错误

有时它的行为非常随机,在下图中我们可以看到 hystrix: timeouthystrix: circuit open

之间没有相关性

sudo/示例 hystrix 代码:

func crawl(vendor string, req *http.Request, timeout int) (result []byte) {

    hystrix.Do(vendor, func() error {

        resp, err := httpClient.Do(req)
        if err != nil {
            log.Errorln("Error sending post request: ", err)
        } else {
            defer resp.Body.Close()
        }
        respBody, errResp := ioutil.ReadAll(resp.Body)
        if errResp != nil {
            log.WithFields(log.Fields{"RequestID": requestID}).Errorln("Error reading parser response", errResp, resp.Status)
        }

        if resp.StatusCode == 200 {
            result = respBody
        } else {
            log.Errorln(" SERVER SIDE ERROR", resp.StatusCode, obj)
        }

        return nil
    }, func(err error) error {
        logApiTimeouts(vendor, err)
        log.WithFields(log.Fields{"RequestID": requestID}).Errorln("Hystrix Error:", err, obj)
        return nil
    })
}

有没有人遇到过这个错误以及如何解决这个问题?

【问题讨论】:

    标签: go hystrix netflix fault-tolerance


    【解决方案1】:

    可能是因为 requestVolumeThreshold 默认设置为 20。

    根据来自 hystrix golang 客户端的文档,

    // DefaultVolumeThreshold is the minimum number of requests needed before a circuit can be tripped due to health
    DefaultVolumeThreshold = 20
    

    你可以设置它,

    // Settings returns the hystrix command config
    func (c Config) Settings() hystrix.CommandConfig {
       return hystrix.CommandConfig{
          Timeout:                8000,
          RequestVolumeThreshold: 1000, // FIXME: all calls must be paginated
       }
    }
    

    将其调整为大于默认值的某个数字修复了我的错误。

    【讨论】:

      猜你喜欢
      • 2020-10-29
      • 2017-05-29
      • 2019-05-25
      • 2016-03-24
      • 2015-07-12
      • 2016-08-06
      • 2017-10-11
      • 2015-05-23
      • 1970-01-01
      相关资源
      最近更新 更多