Hystrix是什么?
Hystrix是Netflix开源库,这是一个针对分布式系统的延迟和容错库。
Hystrix 供分布式系统使用,提供延迟和容错功能,隔离远程系统、访问和第三方程序库的访问点,防止级联失败,保证复杂的分布系统在面临不可避免的失败时,仍能有其弹性。
Netflix称,在分布式环境中,不可避免会造成一些服务的失败。Hystrix 库旨在控制分布式服务中提供更大容限和服务失败之间的相互关系。Hystrix 通过隔离访问远程系统、服务和第三方库的点,阻止级联故障,从而使复杂的分布式系统更具弹性。
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
简单说,在日益庞大的微服务系统中,Hystrix的作用就是来避免当某个服务发生故障时,形成发散型的影响,导致越来越多的服务故障。
Hystrix有什么?
资源隔离
包括线程池隔离和信号量隔离,限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用。
Hystrix隔离模式–信号量模式
当 n 个并发请求去调用一个目标服务接口时,都要获取一个信号量才能真正去调用目标服务接口,但信号量有限,默认是 10 个(通过maxConcurrentRequests参数配置),如果并发请求数多于信号量个数,就有线程需要进入队列排队,但排队队列也有上限,默认是 5,如果排队队列也满,则必定有请求线程会走 fallback 流程,从而达到限流和防止雪崩的目的。
Hystrix隔离模式–线程池模式
当 n 个请求线程并发对某个接口请求调用时,会先从 hystrix 管理的线程池里面获得一个线程,然后将参数传递给这个线程去执行真正调用。线程池的大小有限,默认是 10 个线程(maxConcurrentRequests参数配置),如果并发请求数多于线程池线程个数,就有线程需要进入队列排队,但排队队列也有上限,默认是 5,如果排队队列也满,则必定有请求线程会走 fallback 流程。
线程池模式可以支持异步调用,支持超时调用,支持直接熔断,存在线程切换,开销大。
两种模式的对比
通过二者的对比,我们可以发现信号量模式比较适用于一些业务逻辑比较复杂的访问,而线程池的适用性比较普遍,特别是对外的服务访问
降级机制
什么是降级?
当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。
降级机制有哪些?
超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据。
服务融断
服务熔断是什么?
一般是指软件系统中,由于某些原因使得服务出现了过载现象,为防止造成整个系统故障,从而采用的一种保护措施,所以很多地方把熔断亦称为过载保护。
为什么需要服务熔断?
很多时候刚开始可能只是系统出现了局部的、小规模的故障,然而由于种种原因,故障影响的范围越来越大,最终导致了全局性的后果。 适用场景:防止应用程序直接调用那些很可能会调用失败的远程服务或共享资源
缓存
缓存在高并发的环境下使用,能够有效地减少服务器的压力, 使用Hystrix返回结果缓存,后续请求可以直接调用缓存数据。
缓存的使用
开启请求缓存:在实现HystrixCommand或HystrixObservableCommand时,通过重载getCacheKey()方法来开启请求缓存
清理失效缓存功能:Hystrix中,可以通过HystrixRequestCache.clear()方法来进行缓存的清理,适用于对缓存数据进行更新的场景。