vlambda博客
学习文章列表

深入浅出Hystrix GO源码 --- 什么是Hystrix


        在软件工程领域,为保证服务的可用性和稳定性,提出了很多解决方案,包括但不限于:限流、熔断、降级和容灾等。本文介绍的Hystrix-go就是一种基于lib库方式实现服务的熔断降级方案。

01

Hystrix是什么?

        引用官方库的定义:

“ Hystrix is a latency and fault tolerance library designed to isolate points of access to remote systems, services and 3rd party libraries, stop cascading failure and enable resilience in complex distributed systems where failure is inevitable.”
       Hystrix在使用lib库(GRPC)调用远端服务时,引入超时控制和熔断降级处理机制,当后端服务不可用时,执行用户自定的降级策略,防止单点服务故障的全局扩散,保障服务本身的可用性和稳定性。
  • Hystrix发展历史
        Hystrix是由Netflix API工作小组,在2011年的弹性工程项目演变而来的。在2012年的时候,Hystrix不断发展和成熟,Netflix内部的许多团队都采用这样的方式访问下游服务。Hystrix最早是由JAVA语言实现,后出现了很多其他语言版本,本文讲的Hystrix-go就是基于GO语言实现的版本。
  • Hystrix设计的目的
        以lib库的方式,控制(通过网络 | RPC)访问下游的流量、超时时间和失败回调函数,保护服务不受下游故障影响。主要包含:
  1. 防止故障在复杂的分布式系统中扩散。
  2. 快速失败、快速恢复。
  3. 提供失败回调功能,在必要时实现功能降级。
  4. 提供准实时的监控、报警和操作能力。

02


Hystrix-go主要结构

        Hystrix-go如何组织来实现设计目的的呢?下图是笔者根据自己的理解绘制的一张依赖图:

                               图 1.1 hystrix-go依赖关系图
         其中浅蓝色部代表的是包(package),浅绿色的部分代表的是组件(component),箭头的指向是依赖关系。hystrix包,实现了Hystrix的核心能力,包括访问后端的流量控制,超时控制,失败处理策略、熔断以及后端链路的统计量数据收集和链路健康判断等相关功能。plugins包,主要侧重于服务依赖的后端健康数据的上报工作,开发者根据这个包提供的能力定制自己数据监控。 基础组件有3个,分别是Rolling、executorPool和metricCollector。
Rolling组件: 实现了依赖后端健康状态的统计数据,如:成功次数,失败次数,拒绝次数等,需要说明的是,对于量维度的统计组件默认只统计最近10秒的数据,而对于时间维度的统计组件默认只统计最近60秒的数据。
executorPool组件: 实现一个令牌筒算法,用于限制后端的请求量。
metricCollector组件: 实现了后端统计量的采集。
metricExchange组件: 实现后端服务统计数据的管理。
CircuitBreaker组件: 实现量后端的健康状态判断,熔断,降级以及统计数据的采集和管理工作。
StreamHandler组件: 实现后端统计数据的上报功能。
03


Hystrix功能实现
        Hystrix在请求依赖的下游时到底干了什么?是如何控制访问下游的流量、超时时间,又是根据什么判断下游是否正常,什么时候开启熔断,什么关闭熔断呢?下面通过结构图分析Hystrix-go在访问下游的流程。
 图 1.2 hystrix-go执行流程图
         图1.2完整的描述了使用Hystrix访问后端的全流程。Hystrix的核心流程主要由3部分组成:令牌筒限流、状态数据统计、健康度判断。
        Hystrix通过引入健康度来表征依赖后端的健康状态,通过健康状态判断后端是否可用。为了能够更好的描述健康度,Hystrix使用以下指标(可配置):
timeout: 执行后端请求需要的最大时间,默认是1秒。当执行后端的时间超过这个设置,则返回失败(请求超时)。
max_concurrent_requests: 同一时间、访问相同后端的相同请求的最大请求数,通过该值控制后端相同请求的访问并发量。默认是10。
request_volume_threshold: 健康度阀值。当后端的请求数小于该值时,认为后端健康,不再进行健康度判断。默认是20。
sleep_window: 重试时间间隔。当后端健康度不达标时触发熔断操作,该时间用来表征自后端熔断之后多少毫秒后开始尝试探活(尝试请求后端是否正常)。
error_percent_threshold: 后端请求的错误率。该值用来描述后端是否健康,当后端的请求的错误率大于等于该值时,认为后端不健康,开启熔断,执行降级逻辑。

注:这些参数具体是怎么使用的将在后面章节讲解源码部分详细介绍。

04


Hystrix-go代码结构

Hystrix-go GitHub项目的目录结构

├── LICENSE├── README.md├── Vagrantfile├── hystrix│   ├── rolling│ ├── metric_collector│   ├── circuit.go│   ├── circuit_test.go│   ├── doc.go│   ├── eventstream.go│   ├── eventstream_test.go│   ├── hystrix.go│   ├── hystrix_test.go│   ├── logger.go│   ├── metrics.go│   ├── metrics_test.go│   ├── pool.go│   ├── pool_metrics.go│   ├── pool_test.go│   ├── settings.go│   └── settings_test.go├── loadtest│   ├── README.md│   └── service├── plugins│   ├── datadog_collector.go│   ├── graphite_aggregator.go│   ├── statsd_collector.go│   └── statsd_collector_test.go└── scripts └── vagrant.sh
目录功能介绍:
  • hystrix:核心功能实现
    • rolling:统计数据数据统计基本数据结构
    • metric_collector:统计数据控制
  • plugins:监控数据输出控制


后续会逐一分析Hystrix各个组件包的源码实现(令牌筒限流、统计数据采集、健康度判断能),敬请关注。



码字不易,且看且珍惜。



hystrix-go github doc

https://godoc.org/github.com/afex/hystrix-go

hystrix-go GitHub code

https://github.com/afex/hystrix-go