初识Spring Cloud系列——Hystrix原理

701 阅读5分钟

这是我参与更文挑战的第20天,活动详情查看: 更文挑战

听说,一位神情恬淡、梳着齐刘海的小男孩双手执羊角骑于跪卧的羊背上,目视前方,身着花瓣与菱形纹饰的坎肩,双腿微微向后弯曲,背部有竖向穿孔(来自琥珀小儿骑羊串饰,千年前的爸爸送女儿的礼物)

往事越千年。

今日,中国女排3-0美国 世界联赛七连胜收官

好了,回归主题,跟着小编来开始一个新的知识点吧,看看Hystrix为何?

课前小故事

起因

亚利桑那电力公司下属的一名员工在尤马市南部北吉拉变电站更换该变电站内监控设备的故障电容器时操作失误,导致变电站监控系统发生故障,变电站员工在进行恢复操作时发生了意外短路,造成尤马郡5.6万用户停电。

发展

停电事故未能限制在当地,导致核电站2座核反应堆因电力中断而自动关闭,系统失去主要电源后,系统电压进一步下降,当地系统中的发电机组相继退出运行,最终导致系统完全崩溃

影响

美国的加州圣迭戈市、亚利桑纳州尤马市和墨西哥的提华纳市等地均受停电的严重影响,其中,圣迭戈市超过100万用户完全停电,提华纳市46万市民失去电力供应,尤马市及其周边约5.6万人失去电力,整个停电时间持续12h。直到次日早上2:15,停电地区电力系统成功黑启动,并逐步恢复正常运行,事故地区的4.3GW停电负荷才基本恢复供电。

Hystrix是什么?

Hystrix是一个用于处理分布式系统的延迟和容错的开源库,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。

简单说,在日益庞大的微服务系统中,Hystrix的作用就是来避免当某个服务发生故障时,形成发散型的影响,导致越来越多的服务故障。

Hystrix有什么?

资源隔离

包括线程池隔离和信号量隔离,限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用。

Hystrix隔离模式--信号量模式

当 n 个并发请求去调用一个目标服务接口时,都要获取一个信号量才能真正去调用目标服务接口,但信号量有限,默认是 10 个(通过maxConcurrentRequests参数配置),如果并发请求数多于信号量个数,就有线程需要进入队列排队,但排队队列也有上限,默认是 5,如果排队队列也满,则必定有请求线程会走 fallback 流程,从而达到限流和防止雪崩的目的。

Hystrix隔离模式--线程池模式

当 n 个请求线程并发对某个接口请求调用时,会先从 hystrix 管理的线程池里面获得一个线程,然后将参数传递给这个线程去执行真正调用。线程池的大小有限,默认是 10 个线程(maxConcurrentRequests参数配置),如果并发请求数多于线程池线程个数,就有线程需要进入队列排队,但排队队列也有上限,默认是 5,如果排队队列也满,则必定有请求线程会走 fallback 流程。

线程池模式可以支持异步调用,支持超时调用,支持直接熔断,存在线程切换,开销大。

两种模式的对比

image.png

通过二者的对比,我们可以发现信号量模式比较适用于一些业务逻辑比较复杂的访问,而线程池的适用性比较普遍,特别是对外的服务访问

降级机制

什么是降级?

当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。

降级机制有哪些?

超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据。

服务融断

服务熔断是什么?

一般是指软件系统中,由于某些原因使得服务出现了过载现象,为防止造成整个系统故障,从而采用的一种保护措施,所以很多地方把熔断亦称为过载保护。

为什么需要服务熔断?

很多时候刚开始可能只是系统出现了局部的、小规模的故障,然而由于种种原因,故障影响的范围越来越大,最终导致了全局性的后果。 适用场景:防止应用程序直接调用那些很可能会调用失败的远程服务或共享资源

缓存

缓存在高并发的环境下使用,能够有效的减少服务器的压力, 使用Hystrix返回结果缓存,后续请求可以直接调用缓存数据。

缓存的使用

开启请求缓存:在实现HystrixCommand或HystrixObservableCommand时,通过重载getCacheKey()方法来开启请求缓存

清理失效缓存功能:Hystrix中,可以通过HystrixRequestCache.clear()方法来进行缓存的清理,适用于对缓存数据进行更新的场景

在今天这个特殊的日子里,小编赶紧跟完陪家人去了,估计各位道友看到本文的时候,父亲节已经过去了,哈哈。