什么是Hystrix?
在一个分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,如何能够保证在一个依赖出问题的情况下,不会导致整体服务失败雪崩,这个就是Hystrix需要做的事情。
hystrix功能
- 隔离(线程池隔离和信号量隔离):限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用。
- 优雅的降级机制:超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据。
- 熔断:当失败率达到阀值自动触发降级(如因网络故障/超时造成的失败率高),熔断器触发的快速失败会进行快速恢复。
- 缓存:提供了请求缓存、请求合并实现。
- 支持实时监控、报警、控制(修改配置)
隔离
线程池隔离 | 信号量隔离 | |
---|---|---|
线程 | 与调用线程非相同线程 | 与调用线程相同 |
开销 | 排队、调度、上下文开销等 | 无线程切换,开销低 |
异步 | 支持 | 不支持(无法削峰) |
并发支持 | 支持(最大线程池大小) | 支持(最大信号量上限) |
熔断
正常状态下,电路处于闭合状态(Closed),如果调用持续出错或者超时,电路被打开进入熔断状态(Open),后续一段时间内的所有调用都会被拒绝(Fail Fast),一段时间以后,保护器会尝试进入半熔断状态(Half-Open),允许少量请求进来尝试,如果调用仍然失败,则回到熔断状态,如果调用成功,则回到电路闭合状态;
降级
降级需要对下层依赖的业务分级,把产生故障的丢了,换一个轻量级的方案,是一种退而求其次的方法。
通常降级有:1.如果服务失败,则我们通过fallback进行降级,返回静态值。2.采用服务级联的模式,如果第一个服务失败,则调用备用服务,例如失败重试或者访问缓存失败再去取数据库。
hystrix应用
参数说明
参数类型 | 参数名 | 默认值 | 说明 |
---|---|---|---|
command配置 | executionIsolationStrategy | ExecutionIsolationStrategy.THREAD | 信号隔离或线程隔离,默认:采用线程隔离, |
executionIsolationThreadTimeoutInMillisecond | 1s | 隔离时间大,即多长时间后进行重试 | |
executionIsolationSemaphoreMaxConcurrentRequests | 10 | 使用信号量隔离时,命令调用最大的并发数,默认:10 | |
fallbackIsolationSemaphoreMaxConcurrentRequests | 10 | 使用信号量隔离时,命令fallback(降级)调用最大的并发数,默认:10 | |
fallbackEnabled | true | 是否开启fallback降级策略 | |
executionIsolationThreadInterruptOnTimeout | true | 使用线程隔离时,是否对命令执行超时的线程调用中断(Thread.interrupt())操作 | |
metricsRollingStatisticalWindowInMilliseconds | 10000ms | 统计滚动的时间窗口,默认:10s | |
metricsRollingStatisticalWindowBuckets | 10 | 统计窗口的Buckets的数量,默认:10个 | |
metricsRollingPercentileEnabled | true | 是否开启监控统计功能,默认:true | |
requestLogEnabled | true | 是否开启请求日志 | |
requestCacheEnabled | true | 是否开启请求缓存 | |
熔断器配置 | circuitBreakerRequestVolumeThreshold | 20 | 主要用在小流量 |
circuitBreakerSleepWindowInMilliseconds | 5000ms | 熔断器默认工作时间,默认:5秒.熔断器中断请求5秒后会进入半打开状态,放部分流量过去重试 | |
circuitBreakerEnabled | true | 是否启用熔断器,默认true. 启动 | |
circuitBreakerErrorThresholdPercentage | 50 | 默认:50%。当出错率超过50%后熔断器启动 | |
circuitBreakerForceOpen | false | 是否强制开启熔断器阻断所有请求,默认:false,不开启 | |
circuitBreakerForceClosed | false | 是否允许熔断器忽略错误,默认false, 不开启 | |
线程池配置 | HystrixThreadPoolProperties.Setter().withCoreSize(int value) | 10 | 配置线程池大小,默认值10个 |
HystrixThreadPoolProperties.Setter().withMaxQueueSize(int value) | -1 | 配置线程值等待队列长度 |