注:本文并非是精确的文档翻译,而是根据自己理解的整理,有些内容可能由于理解偏差翻译有误,有些内容由于是显而易见的,并没有翻译,而是略去了。本文更多是学习过程的产出,请尽量参考原官方文档。

什么是Hystrix?

在分布式系统中,不可避免地会出现许多依赖的服务不可用的情况。Hystrix通过实现容错和延时容忍逻辑来实现对相互依赖的分布式服务的控制。Hystrix主要通过隔离服务的调用,阻止级联的服务调用失败以及提供降级策略来提升系统的整体可伸缩性(resiliency)。

Hystrix 在2011年开始由Netflix的API团队开发,并逐渐在Netflix内部得到广泛使用。

Hystrix的目的

Hystrix被设计用来:

  • 通过引入第三方客户端库实现对保护应用避免受延时和失败的服务调用带来的影响。
  • 在复杂的系统中防止级联故障(cascading failures)
  • 快速失败,快速回复
  • 回退和优雅降级
  • 提供近实时的监控、告警和操作控制。

Hystrix解决什么问题?

分布式系统中存在众多的服务,每个服务都难免出现不可用的情况。如果主应用(关注的应用)没有和这些不可用的服务隔离,将遭受被这些服务拖垮的危险。

例如,对于一个依赖30个可用性为99.99%服务的应用,其本身的可用性将是:

0.9999^30=99.7%

这意味着,10,000,000次前端中,将有30,000次失败

每个月中,应用不可用的时间将至少是2小时

实际情况往往比这更差。


在一切都正常时,客户发来的请求的调用示意如下:

当某一个后台服务出现超时,或者不可用,他将阻塞整个请求:

对于访问量大的后台服务,如果一旦出现超时,数秒内真个应用的系统资源可能会被立刻耗尽。

在应用中,任何一个通过网络实现的外部调用都是可能失败的。更甚的是,这些不可用的服务,将会逐渐耗尽所有调用其提供服务的其他应用的资源,最终可能导致整个系统的雪崩。

对于通过第三方组件实现网络访问的情况,这种问题更加严重。第三方组件对于应用来说是一个黑盒,其实现细节不可见,对于不同的客户端组件,网络和资源的配置情况各不相同,并且通常难以修改和监控。

更糟糕的是,还可能存在那些我们并不知道的由第三方组件引入的可变的依赖,引起巨大的网络资源消耗或者错误的远程调用。

网络不可用;服务或者节点失效;新组件引入的功能改变;组件的bug。凡此种种,都是需要隔离起来的错误,避免一个服务的不可用导致整个应用或者系统的不可用。

##Hystrix 遵循的设计原则:

  • 防止单个依赖耗尽整个容器用户线程。
  • 采用去掉负荷和快速失败,而不是排队
  • 在任何可行的情况下通过降级避免失败
  • 通过隔离策略(隔离舱bulkhead,泳道swimlan,断路器circuit break 设计模式)来限制单个依赖可能引起的影响
  • 通过近实时的指标、监控和告警来降低错误发现时间
  • 配置修改快速生效,支持动态属性设置,提供实时修改配置功能
  • 避免应用受到所有的依赖的失败带来的影响,而不只是网络拥堵

Hystrix如何实现其目标?

  • 将对外部系统的调用封装到HystrixCommand或者HystrixObserverbalCommand对象中,此对象通常在独立的线程中执行(命令模式)
  • 根据给定的配置,对于超过时间上上限的调用进行统计
  • 对每个依赖维护一个线程池(或者信号量),当线程池满时,触发该依赖的请求将被直接拒绝,而不是排队等待
  • 统计调用的成功、失败、超时、线程拒绝次数
  • 当失败的调用超过一定预设的阈值后,在一定时间内触发熔断
  • 在请求失败、拒绝、超时、或者熔断时,执行降级逻辑
  • 对各项指标进行近实时的监控和配置修改

当采用Hystrix封装各依赖时,服务调用示意图如下:

[Reference]

https://github.com/Netflix/Hystrix/wiki

[翻译]Hystrix wiki–Home的更多相关文章

  1. [翻译]Hystrix wiki–How it Works

    注:本文并非是精确的文档翻译,而是根据自己理解的整理,有些内容可能由于理解偏差翻译有误,有些内容由于是显而易见的,并没有翻译,而是略去了.本文更多是学习过程的产出,请尽量参考原官方文档. 流程图 下图 ...

  2. PHP经验——PHPDoc PHP注释的标准文档(翻译自Wiki)

    文档注释,无非“//”和“/**/”两种 ,自己写代码,就那么点,适当写几句就好了:但是一个人总有融入团队的一天,团队的交流不是那几句注释和一张嘴能解决的,还需要通用的注释标准. PHPDoc是PHP ...

  3. 翻译:wiki中的business logic词条

    Business logic 业务逻辑 From Wikipedia, the free encyclopedia 来自Wikipedia,自由的百科全书 In computer software, ...

  4. 翻译wiki(一):Bios boot partition

    文章翻译自wiki,水平有限,若有错万请见谅.原文:https://en.wikipedia.org/wiki/BIOS_boot_partition BIOS boot partition是一个分区 ...

  5. 【附1】hystrix详述(1)

    一.hystrix的作用 控制被依赖服务的延时和失败 防止在复杂系统中的级联失败 可以进行快速失败(不需要等待)和快速恢复(当依赖服务失效后又恢复正常,其对应的线程池会被清理干净,即剩下的都是未使用的 ...

  6. 【第十九章】 springboot + hystrix(1)

    hystrix是微服务中用于做熔断.降级的工具. 作用:防止因为一个服务的调用失败.调用延时导致多个请求的阻塞以及多个请求的调用失败. 1.pom.xml(引入hystrix-core包) 1 < ...

  7. 附1 hystrix详述(1)

    一.hystrix的作用 控制被依赖服务的延时和失败 防止在复杂系统中的级联失败 可以进行快速失败(不需要等待)和快速恢复(当依赖服务失效后又恢复正常,其对应的线程池会被清理干净,即剩下的都是未使用的 ...

  8. 第十九章 springboot + hystrix(1)

    hystrix是微服务中用于做熔断.降级的工具. 作用:防止因为一个服务的调用失败.调用延时导致多个请求的阻塞以及多个请求的调用失败. 1.pom.xml(引入hystrix-core包) <! ...

  9. 传统项目利用Hystrix实现热点接口的服务隔离

    这段时间接了个需求,需要在我目前负责的数据系统上加个接口,主要是实现用户行为的记录.前端对接的项目主要有公司的PC,WAP,WEIXIN,APP等,每个端大概有两台左右的负载.因为目前我的这个项目主要 ...

随机推荐

  1. C#中的多线程 - 高级多线程 z

    原文:http://www.albahari.com/threading/part4.aspx 专题:C#中的多线程 1非阻塞同步Permalink 之前,我们描述了即使是很简单的赋值或更新一个字段也 ...

  2. 【Leetcode】【Medium】Path Sum II

    Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...

  3. 一个老IT产品管理者对于产品经理工作的经验总结

    一个老IT产品管理者对于产品经理工作的经验总结 1. 任何行业,包括IT行业,所谓产品管理.产品经理,其核心应该是企业产品管理制度,也就是说,只有企业存在相应的.合理的产品管理体系和制度,产品管理.产 ...

  4. ZT 类与类之间的四种关系

    csdn上一个好贴子:http://bbs.csdn.net/topics/390646332 类与类之间的四种关系1.依赖(Dependency)   类A在类B中作为一个成员函数的参数或者是返回值 ...

  5. Promise里捕捉错误的最佳实践

    Promise里的同步部分不需要try catch new Promise((resolve, reject) => { throw new Error('error'); setTimeout ...

  6. mongodb 备份、还原、导入、导出

    mongodump备份数据库 常用的备份命令格式 mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件存在路径 如果想导出所有数据库,可以去掉-d - ...

  7. D3——动态绑定数据

    一.绑定数组元素 , , , , ]; d3.select("body") .selectAll("p") .data(dataset) .enter() .a ...

  8. 解析纯真IP地址库

    一周以来,一直在做 IP地址库的解析.从调研到编码到优化,大概花了有七八天的时间.感觉很好玩.总结一下整个做的过程. 1.关于IP 地址库的解析方式 目前主要的解析方式有两种:通过API,或通过IP数 ...

  9. PHP-----文件-----目录操作

    目录操作 [1]创建目录(文件夹) mkdir("路径"); 例子: mkdir("./test"); 显示的结果:   [2]删除目录(文件夹)只能删除空的文 ...

  10. 总结PHP删除字符串最后一个字符的三种方法

    一.前言 从数据库中select()读取一对多的信息时,经常需要将取出的数组用某个特定的字符分割,然后拼接成字符串. 常见的语法格式: foreach ($arr as $key => $val ...