Hystrix配置总结

Spring 搭建微服务的时候,比较常用的http客户端工具就是 Feign,以其声明的方式来编写 HTTP 请求。涉及到微服务请求,就一定要设置请求超时时间和熔断策略,来避免因为单一服务卡死导致的集群雪崩等灾难性事件。

具体的 Feign 和 Hystrix 如何集成,Spring 官方都有对应的 Demo,下面主要是分析一下熔断策略的配置。

  • hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds 请求超时时间。超时后会直接中断请求,调用 fallback 方法。

  • hystrix.command.default.metrics.rollingStats.timeInMilliseconds 滚动窗口的时间范围。所有的接口请求是否超时等指标进行累计统计的时间范围。该值越小,则时间窗越小,占用的内存会更小。反之则时间窗越大,占用的内存越多。

  • hystrix.command.default.circuitBreaker.requestVolumeThreshold 滚动窗口内相同 CommandKey 的请求数量达到多少并发量,才会触发熔断的判断机制。此处一定要注意,是相同 CommandKey。在 Feign 的默认机制中,CommandKey=类名+方法签名,也就是单个 HTTP API 接口

  • hystrix.command.default.circuitBreaker.errorThresholdPercentage 滚动窗口内触发熔断的最低失败线程的百分比,即在滚动窗口内达到了并发量 requestVolumeThreshold 以上,且失败线程>并发线程数*errorThresholdPercentage,就会触发熔断。

  • hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds 一旦触发熔断后,熔断器打开的时间长度,这段时间内,会直接调用 fallback 方法而不请求目标服务。过了这段时间范围后被请求,则会用一个线程尝试请求目标服务,如果目标服务健康访问,则取消熔断,反之继续开启熔断。

如果 requestVolumeThreshold 设置过大,thread.timeoutInMilliseconds > rollingStats.timeInMilliseconds,而 Web 容器的并发数比较小,可能会导致永远不会熔断。

所以thread.timeoutInMilliseconds 一般要小于 rollingStats.timeInMilliseconds。如果不行的话,就得降低 requestVolumeThreshold 并发量,让单个页面上调用的微服务接口能在 Web 容器的并发数限制下达到熔断判断的最低并发量。这样如果目标服务挂了,客户频繁刷新页面也能靠着熔断打开,快速 fallback,不至于耗尽 web 容器的线程数而导致应用瘫痪。

请登录后发表评论

    没有回复内容