隔离服务
计算机的线程、内存等资源是有上限的,达到上限时,离系统被拖垮宕机的时间就不短了。特别是访问网络资源,由于网络的不稳定性,被依赖资源的不稳定性都可能出现处理延迟。在一个高并发高流量的互联网系统中,一旦其中有一个依赖处理延迟,瞬间系统的所有线程和内存都会被这一个依赖所占用,导致其他服务也没有资源处理,甚至整个系统被宕机。
Hystrix提供了对访问资源的隔离机制,对每一个依赖分配合理的资源。如果一个依赖处理延迟,也只是分配给他的资源被占用,不会影响其他服务应有的资源。从而保证了系统能够高效稳定运行,继续提供其他服务。
Hystrix组件提供了两种隔离的解决方案:线程池隔离和信号量隔离。两种隔离方式都是限制对共享资源的并发访问量,线程在就绪状态、运行状态、阻塞状态、终止状态间转变时需要由操作系统调度,占用很大的性能消耗;而信号量是在访问共享资源时,进行tryAcquire,tryAcquire成功才允许访问共享资源。
线程池隔离
客户端(lib库,网络调用等等)都是在单独的线程上执行。从调用线程(Tomcat线程池)上隔离他们,以便用户可以直接响应一个耗时的依赖调用。
线程池隔离一般用于不同业务间的隔离,防止相互间的影响。线程池隔离,同样是继承HystrixCommand ,重写 run方法,在里面实现业务逻辑。
protected HelloCommandIsolateThreadPool(String name) {
super(HystrixCommand.Setter.
//设置GroupKey 用于dashboard 分组展示
withGroupKey(HystrixCommandGroupKey.Factory.asKey("hello"))
//设置commandKey 用户隔离线程池,不同的commandKey会使用不同的线程池
.andCommandKey(HystrixCommandKey.Factory.asKey("hello" + name))
//设置线程池名字的前缀,默认使用commandKey
.andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("hello$Pool" + name))
//设置线程池相关参数
.andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter()
.withCoreSize(15)
.withMaxQueueSize(10)
.withQueueSizeRejectionThreshold(2))
//设置command相关参数
.andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
//是否开启熔断器机制
.withCircuitBreakerEnabled(true)
//舱壁隔离策略
.withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.THREAD)
//circuitBreaker打开后多久关闭
.withCircuitBreakerSleepWindowInMilliseconds(5000)));
//设置GroupKey 用于dashboard 分组展示
withGroupKey(HystrixCommandGroupKey.Factory.asKey("hello"))
//设置commandKey 用户隔离线程池,不同的commandKey会使用不同的线程池
.andCommandKey(HystrixCommandKey.Factory.asKey("hello" + name))
//设置线程池名字的前缀,默认使用commandKey
.andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("hello$Pool" + name))
//设置线程池相关参数
.andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter()
.withCoreSize(15)
.withMaxQueueSize(10)
.withQueueSizeRejectionThreshold(2))
//设置command相关参数
.andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
//是否开启熔断器机制
.withCircuitBreakerEnabled(true)
//舱壁隔离策略
.withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.THREAD)
//circuitBreaker打开后多久关闭
.withCircuitBreakerSleepWindowInMilliseconds(5000)));
}
//舱壁隔离策略
.withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.THREAD)设置隔离策略是关键,默认是信号隔离,如果不设置为线程池隔离,上面设置的线程池相关的参数都无意义。开启熔断器机制,如果在10秒内50%以上的请求都失败,回路就会被断开,后面的请求都会直接返回失败,即 Fast Fail 策略。withCircuitBreakerSleepWindowInMilliseconds 5秒后会尝试闭合电路 。
在系统内部,线程池存放在一个ConcurrentHashMap中,key是commandKey ,value就是线程池。线程池的名字是 ThreadPoolKey值。
为避免在系统运行过程中,频繁的创建新的线程,过段时间又销毁线程,在Hystrix系统内部,线程池的最大线程数和核心线程数是同样大小,所以设置时,只有一个CoreSize参数需要设置。
信号隔离
线程计算机中有限的宝贵资源,线程的调度也需要由用户空间切换到操作系统空间。可以通过Semaphore或者counts限制对依赖资源的并发访问量。如果是同一个业务部同资源的隔离,建议使用信号隔离。在需要申请资源时,先去try获取一个permit。在获取的过程中不需要操作系统参与,所以相比于线程来说,信号是个轻量级的隔离方式。
Hystrix库中的信号类 TryableSemaphore是JDK库的优化版,内部是通过一个AtomicInteger类型的变量来存储permitCount的。之所以说是JDK的优化版,TryableSemaphore在tryAcquire时不会阻塞,每次申请一个permit成功后,permitCount就会incrementAndGet,释放资源时,permitCount就会decrementAndGet。而JDK版本的Semaphore 是通过AQS实现的,内部逻辑复杂,并且在tryAcquire时,会阻塞。为什么不用JDK版本的Semaphore官方给的答案是:
Semaphore that only supports tryAcquire and never blocks and that supports a dynamic permit count.
Using AtomicInteger increment/decrement instead of java.util.concurrent.Semaphore since we don't need blocking and need a custom implementation to get the dynamic permit count and since AtomicInteger achieves the same behavior and performance without the more complex implementation of the actual Semaphore class using AbstractQueueSynchronizer.
在开发时,跟线程池隔离类似,同样是继承HystrixCommand类,在run方法中实现业务逻辑,通过getFallback 实现优雅降级。只是在设置隔离策略及相关参数数有较小的变化:
protected HelloCommandIsolateSemaphore(String key, int semaphoreCount) {
super(HystrixCommand.Setter
//设置GroupKey 用于dashboard 分组展示
.withGroupKey(HystrixCommandGroupKey.Factory.asKey("hello"))
//设置CommandKey 用于Semaphore分组,相同的CommandKey属于同一组隔离资源
.andCommandKey(HystrixCommandKey.Factory.asKey("hello" + key))
//设置隔离级别:Semaphore
.andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
//是否开启熔断器机制
.withCircuitBreakerEnabled(true)
//舱壁隔离策略
.withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.SEMAPHORE)
//设置每组command可以申请的permit最大数
.withExecutionIsolationSemaphoreMaxConcurrentRequests(50)
//circuitBreaker打开后多久关闭
.withCircuitBreakerSleepWindowInMilliseconds(5000)));
super(HystrixCommand.Setter
//设置GroupKey 用于dashboard 分组展示
.withGroupKey(HystrixCommandGroupKey.Factory.asKey("hello"))
//设置CommandKey 用于Semaphore分组,相同的CommandKey属于同一组隔离资源
.andCommandKey(HystrixCommandKey.Factory.asKey("hello" + key))
//设置隔离级别:Semaphore
.andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
//是否开启熔断器机制
.withCircuitBreakerEnabled(true)
//舱壁隔离策略
.withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.SEMAPHORE)
//设置每组command可以申请的permit最大数
.withExecutionIsolationSemaphoreMaxConcurrentRequests(50)
//circuitBreaker打开后多久关闭
.withCircuitBreakerSleepWindowInMilliseconds(5000)));
}
.withExecutionIsolationSemaphoreMaxConcurrentRequests(50)这个参数和线程池的核心线程数是同样的意义,允许有多少个请求同时请求资源。
到此,讲解了如何开发一个线程池隔离的服务,和信号隔离的服务,接下来从源码层面讲解隔离的设计实现。
http://blog.csdn.net/a_fengzi_code_110/article/details/53643474
相关推荐
其次,Hystrix提供了线程池和信号量两种隔离策略。线程池隔离允许每个依赖分配一个独立的线程池,限制并发请求的数量;而信号量隔离则使用计数器限制并发请求,适用于资源消耗较小的场景。这两种策略都可以有效地...
Hystrix 是一个用于处理分布式系统中延迟和故障的库,通过断路器模式来隔离服务间的调用,防止服务雪崩,提高系统的容错性。而Hystrix Dashboard 提供了可视化界面,帮助开发者实时监控这些断路器的状态,了解服务的...
Hystrix是一个由Netflix开源的延迟和容错库,旨在隔离远程系统、服务和第三方库的访问点,停止级联失败,提供后备选项,并实现优雅降级。它在高并发的分布式系统中尤为重要,可以在复杂的系统中保证服务调用的稳定性...
- 降级策略:如果熔断器处于打开状态或者服务调用超时,Hystrix会执行降级逻辑。降级逻辑可以通过HystrixCommand类中的fallbackMethod方法来指定,或者在响应式调用中使用fallback操作符。 Hystrix的入门相对简单,...
其中,Spring Cloud Netflix Hystrix是一款至关重要的组件,它为企业级应用提供了强大的容错保护,实现了服务间的熔断和降级策略,极大地提升了系统的稳定性和可靠性。 Hystrix的核心概念包括: 1. **熔断器模式**...
在Spring Cloud生态系统中,Hystrix是一个至关重要的组件,它主要...在实际开发中,根据具体需求,还可以配置Hystrix的更多高级特性,如线程池、信号量隔离策略、自定义断路器规则等,以进一步优化系统的性能和稳定性。
Hystrix通过隔离请求、降级策略、超时控制等手段,确保即使某个服务出现故障,也不会影响到整个系统的正常运行。其中,Hystrix监控台是观察系统健康状况和性能的重要工具,它能够实时展示服务的运行数据,如请求量、...
2. **隔离(Isolation)**: Hystrix 提供线程池和信号量两种隔离策略,限制同时进行的服务调用数量,防止资源耗尽。 3. **Fallback(回退)**: 当服务调用失败或被熔断器拦截时,可以提供一个备用的回退逻辑,保证...
Hystrix源码简析:包括线程隔离和信号量隔离实现分析、熔断器实现分析等
7. **配置管理**:Hystrix使用HystrixPropertiesManager管理配置,包括断路器阈值、隔离策略参数等。配置可以通过HystrixCommandProperties和HystrixThreadPoolProperties进行细粒度控制,也可以动态调整以适应不断...
本文将重点讲解Hystrix中的资源隔离策略以及Spring Cloud中Hystrix实现的跨线程数据传递原理。 **资源隔离**是Hystrix的核心特性之一,主要是通过线程池和信号量两种方式来实现。线程池隔离是一种常见的实现方式,...
它不仅可以隔离故障,防止雪崩效应,还能提供优雅的降级策略和实时监控,确保系统的稳定性和用户体验。在实际项目中,结合Spring Cloud的其他组件,如Zuul,可以构建出高度可扩展和健壮的微服务架构。在学习和实践中...
为了应对这些问题,Hystrix 提供了一系列机制,包括服务隔离、断路器模式以及回退策略等。 #### Hystrix 解决的问题 在现代微服务架构中,单个应用程序可能依赖于数十甚至数百个其他服务。尽管这些服务可能具有...
**Hystrix** 是 Netflix 开源的一个库,它旨在通过隔离请求、降级策略和熔断机制来保护服务免受级联故障的影响。Hystrix 的核心功能包括: 1. **线程隔离**:Hystrix 将每个服务调用封装在一个单独的线程中,避免了...
本文详解了Spring Cloud中Hystrix线程隔离导致ThreadLocal数据丢失的问题,并通过实例代码演示了该问题的出现原因和解决方法。 知识点1:Hystrix线程隔离 Hystrix是Spring Cloud中的一种断路器实现,用于防止服务...
为了解决这个问题,Netflix开源了Hystrix,一个用于处理服务间调用失败、延迟和过载的库,通过隔离请求、熔断和降级策略,提高了系统的容错性和稳定性。本文将深入探讨Hystrix的核心功能——熔断和降级,并结合实际...
综上所述,`HystrixCommandAspect` 通过 AOP 技术实现了对标注了 `@HystrixCommand` 和 `@HystrixCollapser` 的方法的拦截和增强,通过不同的代理对象生成策略确保了正确地执行 Hystrix 的命令和合并逻辑。...
Hystrix的特性包括断路器机制、断路器触发机制、服务降级-Fallback和资源隔离等。 断路器机制是Hystrix的核心特性。当Hystrix Command在一定时间内请求后端服务失败数量超过一定阈值或超过总请求占比例(默认50%)...
Hystrix是Netflix开源的一款容错框架,包含常用的容错方法:线程隔离、信号量隔离、降级策略、熔断技术。 在高并发访问下,系统所依赖的服务的稳定性对系统的影响非常大,依赖有很多不可控的因素,比如网络连接变慢...