Hystrix 学习使用

Hystrix使用学习

1. 雪崩效应

一个用户请求处理依赖多个服务,如一个用户请求依赖了服务A,P,H,I,正常情况下均能正常访问并返回


1-1
1-1

当其中一个服务(服务I)出现了问题,比如超时,异常,阻塞等,用户请求会被阻塞


1-2
1-2

被阻塞的用户请求将会消耗系统的线程,IO等资源,当该类请求越来越多,占用的计算机资源越来越多的时候,会导致系统瓶颈出现,造成其他的请求同样不可用,最终导致业务系统崩溃,又称为雪崩。


1-3
1-3

如果多个用户的请求中,都存在无法访问的服务,那么他们都将陷入阻塞的状态中。图中都是一个用户请求依赖多个服务,而多个服务中的一个服务出现了问题拖垮了整个系统。

造成雪崩的原因:
1.硬件故障
2.负载过大
3.代码有问题

Hystrix就是为了解决上述问题。
Hystrix提供了熔断模式和隔离模式来解决或者缓解雪崩效应。
这两种方案都属于阻塞发生之后的应对策略,而非预防性策略(例如限流模式)。
Hystrix是在服务访问失败时降低阻塞的影响范围,避免整个服务被拖垮。

Hystrix能做什么:
1. 对通过第三方客户端库访问(通常通过网络)的依赖关系提供保护并控制延迟和故障。
2. 停止复杂分布式系统中的级联故障。
3. 快速故障,快速恢复。
4. 回退,尽可能优雅地降级。
5. 启用近实时监控,警报和操作控制。

2. 隔离

hystrix依赖的隔离架构图

2-1
2-1

Hystrix在用户请求和服务之间加入了线程池。
Hystrix为每个依赖调用分配一个小的线程池,如果线程池已满调用将被立即拒绝,默认不采用排队,加速失败判定时间。线程数是可以被设定的。

原理:
用户的请求将不再直接访问服务,而是通过线程池中的空闲线程来访问服务,如果线程池已满,则会进行降级处理,用户的请求不会被阻塞,至少可以看到一个执行结果(例如返回友好的提示信息),而不是无休止的等待或者看到系统崩溃。

2-2
2-2

其本质是将服务视为资源**,当请求该资源的数量超过了线程池中的数量限制时则不可以再对该资源进行访问,从而保护该资源不会过载而造成阻塞。

3. 熔断

3.1 熔断模式

该模式借鉴了电路熔断的理念,如果一条线路电压过高,保险丝会熔断,防止火灾。

如果某个目标服务调用慢或者有大量超时,此时,熔断该服务的调用,对于后续调用请求,不在继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用。

3.2 熔断器

熔断器是位于线程池之前的组件。

用户请求某一服务之后,Hystrix会先经过熔断器,此时如果熔断器的状态是打开(跳起),则说明已经熔断,这时将直接进行降级处理,不会继续将请求发到线程池。熔断器相当于在线程池之前的一层屏障。

熔断器的工作原理:


3-3
3-3

每个熔断器默认维护10个bucket;每秒创建一个bucket;每个blucket记录成功,失败,超时,拒绝的次数;
当有新的bucket被创建时,最旧的bucket会被抛弃

3.3熔断算法

判断是否进行熔断的依据是:
根据bucket中记录的次数,计算错误率。
计算算法:(failure)/(success+failure)=% of errors if %>threshold,trip circuit, return true, else false

3.4熔断恢复

对于被熔断的请求,并不是永久被切断,而是被暂停一段时间之后,允许部分请求通过,若请求都是健康的,则对请求健康恢复(取消熔断),如果不是健康的,则继续熔断。
服务调用的各种结果(成功,异常,超时,拒绝),都会上报给熔断器,计入bucket参与计算

4流程

4-1
4-1

说明:

  1. 每次调用创建一个新的HystrixCommand,把依赖调用封装在run()方法中
  2. 执行execute()/queue做同步或异步调用
  3. 请求接收后,会先看是否存在缓存数据,如果存在,则不会继续请求服务,直接返回缓存数据。如果不存在缓存数据,则继续进行第4步。
  4. 将判断熔断器是否为开启状态,如果开启(已经熔断),则调用第8步FallBack(降级)处理。如果未开启,则继续调用第5步。
  5. 检测当前依赖的线程池是否已满,如果已满,也会调用第8步FallBack(降级)处理,同时进行第7步将结果上报给熔断器,此时上报的状态为【拒绝】。如果未满,则继续进行第6步。
  6. 执行的是run方法。run方法执行过程中如果发生HystrixBadRequestException以外的异常,也将调用第8步FallBack(降级)处理,同时进行第7步将结果上报给熔断器,此时上报的状态为【失败】。如果run方法执行没有异常但是超过预设的时限也将调用第8步FallBack(降级)处理,同时进行第7步将结果上报给熔断器,此时上报的状态为【超时】。
    如果没有异常也未超时,则进行第9步返回结果,同时进行第7步将结果上报给熔断器,此时上报的状态为【成功】。
    在第8步的降级处理中,如果没有实现getFallback的将直接抛出异常,如果降级逻辑调用,成功直接返回
    ,如果降级逻辑调用,失败抛出异常。

执行过程中位于熔断器之后的处理,都会将结果上报给熔断器,熔断器根据结果计算是否进行熔断。

当服务无法正常访问时,就会进行降级处理,调用fallBack降级策略:


4-2

共有5种情况会触发降级处理:
1.run()方法抛出非HystrixBadRequestException异常。
2.run()方法调用超时。
3.熔断器开启。
4.线程池已满。
5.显示调用fallback逻辑(用于特殊业务处理)
当阻塞发生时(异常,超时等),由于采用了服务降级的处理,可以保证访问可以继续进行。

5 参数设置

参数 作用 备注
maxQueueSize 请求等待队列 默认值:-1,如果使用正数,队列将从SynchronizeQueue改为LinkedBlockingQueue
groupKey 表示所属的group,一个group共用线程池 默认值:getClass().getSimpleName()
fallback.isolation.semaphore.maxConcurrentRequests fallback最大并发度 默认值:10
execution.timeout.enabled 是否打开超时
execution.isolation.thread.timeoutInMilliseconds 超时时间 默认值:1000;</br>在THREAD模式下,达到超时时间,可以中断;</br>在SEMAPHORE模式下,会等待执行完成后,再去判断是否超时.</br>设置标准:</br>有retry,99meantime+avg meantime; 没有retry,99.5meantime
execution.isolation.thread.interruptOnTimeout 是否打开超时线程中断 THREAD模式有效
execution.isolation.strategy 隔离策略,有THREAD和SEMAPHORE 默认使用THREAD模式,以下几种可以使用SEMAPHORE模式:1.只想控制并发度;</br> 2.外部的方法已经做了线程隔离; </br>3.调用的是本地方法或者可靠度非常高、耗时特别小的方法(如medis)</br>
execution.isolation.semaphore.maxConcurrentRequests 信号量最大并发度 SEMAPHORE模式有效,默认值:10
coreSize 线程池coreSize 默认值:10</br>设置标准:qps*99meantime+breathing room
commandKey 默认值:当前执行方法名
circuitBreaker.sleepWindowInMilliseconds 熔断多少秒后去尝试请求 默认值:5000
circuitBreaker.requestVolumeThreshold 熔断触发的最小个数/10s 默认值:20
circuitBreaker.forceClosed 是否强制关闭熔断 如果是强依赖,应该设置为true
circuitBreaker.errorThresholdPercentage 失败率达到多少百分比后熔断 默认值:50</br>主要根据依赖重要性进行调整

参考学习:
Hystrix wiki
Hystrix 分析与使用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容