断路器Hystrix(二):Hystrix原理

关于Hystrix基础应用,请参考断路器Hystrix(一):基础应用

1. 服务雪崩

服务雪崩效应是一种因服务提供者的不可用导致服务调用者的不可用,并将不可用逐渐放大的过程,如图所示。


服务雪崩.jpg

其中,A作为基础的服务提供者,为B和C提供服务,D、E、F是B和C服务的调用者,当A不可用时,将引起B和C的不可用,并将这种不可用放大到D、E、F,从而可能导致整个系统的不可用,服务雪崩的产生可能导致分布式系统的瘫痪。

服务雪崩效应的产生一般有三个流程,首先是服务提供者不可用,然后重试会导致网络流量加大,最后导致服务调用者不可用。

导致服务提供者不可用的原因有很多:可能是因为服务器的宕机或者网络故障;也可能是因为程序存在的缺陷;也有可能是大量的请求导致服务提供者的资源受限无法及时响应;还有可能是因为缓存击穿造成服务提供者超负荷运行等等,毕竟没有人能保证软件的完全正确。

在服务提供者不可用发生之后,用户可能无法忍受长时间的等待,不断地发送相同的请求,服务调用者重新调用服务提供者,同时服务提供者中可能存在对异常的重试机制,这些都会加大对服务提供者的请求流量。然而此时的服务提供者已经是一艘破船,它也无能无力,无法返回有效的结果。

最后是服务调用者因为服务提供者的不可用导致了自身的崩溃。当服务调用者使用同步调用的时候,大量的等待线程将会耗尽线程池中的资源,最终导致服务调用者的宕机,无法响应用户的请求,服务雪崩效应就此发生了。

2. 断路器

在分布式系统中,不同服务之间的调用非常常见,当服务提供者不可用时就很有可能发生服务雪崩效应,导致整个系统的不可用。所以为了预防这种情况的发生,可以使用断路器模式进行预防(类比电路中的断路器,在电路过大的时候自动断开,防止电线过热损害整条电路)。

断路器将远程方法调用包装到一个断路器对象中,用于监控方法调用过程的失败。一旦该方法调用发生的失败次数在一段时间内达到一定的阀值,那么这个断路器将会跳闸,在接下来时间里再次调用该方法将会被断路器直接返回异常,而不再发生该方法的真实调用。这样就避免了服务调用者在服务提供者不可用时发送请求,从而减少线程池中资源的消耗,保护了服务调用者。下图为断路器时序图。


断路器时序图.jpg

如图所示,虽然断路器在打开的时候避免了被保护方法的无效调用,但是当情况恢复正常时,需要外部干预来重置断路器,使得方法调用可以重新发生。所以合理的断路器应该具备一定的开关转化逻辑,它需要一个机制来控制它的重新闭合,下图展示了一个通过重置时间来决定断路器的重新闭合的逻辑。

  1. 关闭状态:断路器处于关闭状态,统计调用失败次数,在一段时间内达到一定的阀值后断路器打开。
  2. 打开状态:断路器处于打开状态,对方法调用直接返回失败错误,不发生真正的方法调用。设置了一个重置时间,在重置时间结束后,断路器来到半开状态。
  3. 半开状态:断路器处于半开状态,此时允许进行方法调用,当调用都成功了(或者成功到达一定的比例),关闭断路器,否则认为服务没有恢复,重新打开断路器。


    断路器状态图.jpg

    断路器的打开能保证服务调用者在调用异常服务时,快速返回结果,避免大量的同步等待,减少服务调用者的资源消耗。并且断路器能在打开一段时间后继续侦测请求执行结果,判断断路器是否能关闭,恢复服务的正常调用。

3. 服务降级操作

断路器为隔断服务调用者和异常服务提供者防止服务雪崩的现象,提供了一种保护措施。而服务降级是为了在整体资源不够的时候,适当放弃部分服务,将主要的资源投放到核心服务中,待渡过难关之后,再重启已关闭的服务,保证了系统核心服务的稳定。

在Hystrix中,当服务间调用发生问题时,它将采用备用的Fallback方法代替主方法执行并返回结果,对失败服务进行了服务降级。当调用服务失败次数在一段时间内超过了断路器的阀值时,断路器将打开,不再进行真正的方法调用,而是快速失败,直接执行Fallback逻辑,服务降级,减少服务调用者的资源消耗,保护服务调用者中的线程资源,如图所示。


服务降级时序图.jpg

4. 资源隔离

在货船中,为了防止漏水和火灾的扩散,一般会将货仓进行分割,避免了一个货仓出事导致整艘船沉没的悲剧。同样的,在Hystrix中,也采用了舱壁模式,将系统中的服务提供者隔离起来,一个服务提供者延迟升高或者失败,并不会导致整个系统的失败,同时也能够控制调用这些服务的并发度。

4.1. 线程与线程池

Hystrix通过将调用服务线程与服务访问的执行线程分隔开来,调用线程能够空出来去做其他的工作而不至于因为服务调用的执行阻塞过长时间。

在Hystrix中,将使用独立的线程池对应每一个服务提供者,用于隔离和限制这些服务。于是,某个服务提供者的高延迟或者饱和资源受限只会发生在该服务提供者对应的线程池中。

如图所示,Dependency D的调用失败或者高延迟仅会导致自身对应的线程池中的5个线程阻塞,并不会影响其他服务提供者的线程池。系统完全与服务提供者请求隔离开来,即使服务提供者对应的线程完全耗尽,并不会影响系统中的其他请求。


资源隔离.jpg

注意在服务提供者的线程池被占满时,对该服务提供者的调用会被Hystrix直接进入回滚逻辑,快速失败,保护服务调用者的资源稳定。

4.2. 信号量

除了线程池外,Hystrix还可以通过信号量(计数器)来限制单个服务提供者的并发量。如果通过信号量来控制系统负载,将不再允许设置超时控制和异步化调用,这就表示在服务提供者出现高延迟时,其调用线程将会被阻塞,直至服务提供者的网络请求超时。如果对服务提供者的稳定性有足够的信心,可以通过信号量来控制系统的负载。

5.Hystrix实现思路

结合上面的介绍,我们可以简单理解一下Hystrix的实现思路:

  1. 它将所有的远程调用逻辑封装到HystrixCommand或者HystrixObservableCommand对象中,这些远程调用将会在独立的线程中执行(资源隔离),这里使用了设计模式中的命令模式。

  2. Hystrix对访问耗时超过设置阀值的请求采用自动超时的策略。该策略对所有的命令都有效(如果资源隔离的方式为信号量,该特性将失效),超时的阀值可以通过命令配置进行自定义。

  3. 为每一个服务提供者维护一个线程池(或者信号量),当线程池被占满时,对于该服务提供者的请求将会被直接拒绝(快速失败)而不是排队等待,减少系统的资源等待。

  4. 针对请求服务提供者划分出成功、失效、超时和线程池被占满等四种可能出现的情况。

  5. 断路器机制将在请求服务提供者失败次数超过一定阀值后手动或者自动切断服务一段时间。

  6. 当请求服务提供者出现服务拒绝、超时和短路(多个服务提供者依次顺序请求,前面的服务提供者请求失败,后面的请求将不会发出)等情况时,执行其Fallback方法,服务降级。

  7. 提供接近实时的监控和配置变更服务。

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