[翻译]Hystrix wiki–Home
注:本文并非是精确的文档翻译,而是根据自己理解的整理,有些内容可能由于理解偏差翻译有误,有些内容由于是显而易见的,并没有翻译,而是略去了。本文更多是学习过程的产出,请尽量参考原官方文档。
什么是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的更多相关文章
- [翻译]Hystrix wiki–How it Works
注:本文并非是精确的文档翻译,而是根据自己理解的整理,有些内容可能由于理解偏差翻译有误,有些内容由于是显而易见的,并没有翻译,而是略去了.本文更多是学习过程的产出,请尽量参考原官方文档. 流程图 下图 ...
- PHP经验——PHPDoc PHP注释的标准文档(翻译自Wiki)
文档注释,无非“//”和“/**/”两种 ,自己写代码,就那么点,适当写几句就好了:但是一个人总有融入团队的一天,团队的交流不是那几句注释和一张嘴能解决的,还需要通用的注释标准. PHPDoc是PHP ...
- 翻译:wiki中的business logic词条
Business logic 业务逻辑 From Wikipedia, the free encyclopedia 来自Wikipedia,自由的百科全书 In computer software, ...
- 翻译wiki(一):Bios boot partition
文章翻译自wiki,水平有限,若有错万请见谅.原文:https://en.wikipedia.org/wiki/BIOS_boot_partition BIOS boot partition是一个分区 ...
- 【附1】hystrix详述(1)
一.hystrix的作用 控制被依赖服务的延时和失败 防止在复杂系统中的级联失败 可以进行快速失败(不需要等待)和快速恢复(当依赖服务失效后又恢复正常,其对应的线程池会被清理干净,即剩下的都是未使用的 ...
- 【第十九章】 springboot + hystrix(1)
hystrix是微服务中用于做熔断.降级的工具. 作用:防止因为一个服务的调用失败.调用延时导致多个请求的阻塞以及多个请求的调用失败. 1.pom.xml(引入hystrix-core包) 1 < ...
- 附1 hystrix详述(1)
一.hystrix的作用 控制被依赖服务的延时和失败 防止在复杂系统中的级联失败 可以进行快速失败(不需要等待)和快速恢复(当依赖服务失效后又恢复正常,其对应的线程池会被清理干净,即剩下的都是未使用的 ...
- 第十九章 springboot + hystrix(1)
hystrix是微服务中用于做熔断.降级的工具. 作用:防止因为一个服务的调用失败.调用延时导致多个请求的阻塞以及多个请求的调用失败. 1.pom.xml(引入hystrix-core包) <! ...
- 传统项目利用Hystrix实现热点接口的服务隔离
这段时间接了个需求,需要在我目前负责的数据系统上加个接口,主要是实现用户行为的记录.前端对接的项目主要有公司的PC,WAP,WEIXIN,APP等,每个端大概有两台左右的负载.因为目前我的这个项目主要 ...
随机推荐
- 【转】ubunt 安装 yum出现 ubuntu 解决“无法获得锁 /var/lib/dpkg/lock -open (11:资源暂时不可用)”的方法
今天本来是用xshell 链接本地的linux的,然而链接的时候没有主动弹出输入 用户名和密码的对话框,google搜了下,遇到了上面的问题. 解决办法如下:1.终端输入 ps aux ,列出进程. ...
- Android学习——BroadCast(一)
初识广播 BroadCast即为广播,为安卓四大组件之一,用于在应用程序和Activity间传输信息.一条广播,分为发送和接收两部分,发送方通过Intent存储信息,并进行发送.接收方通过BroadC ...
- centos系统移植
今天将一个服务器上面的硬盘拆掉放到安装到另外一个服务器上面,硬盘里已经安装系统为centos6.0. 服务器 为dell的1850,好吧,在今天我还有幸搞这种“屎”前的服务器还是很幸运的! 硬盘换了之 ...
- C++ inheritance: public, private. protected ZZ
公有继承(public).私有继承(private).保护继承(protected)是常用的三种继承方式. 1. 公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派生类的成员时, ...
- 页面引入(include)方式的研究及性能比较
1. 应用Html中的框架(iframe) 目前大多数门户网站都应用iframe来进行页面上广告的投放,就是将不同的广告分别应用iframe投放到主页面上,优点是效率高,互不影响,缺点是不符合网页标准 ...
- [翻译] RKCardView
RKCardView Beautiful Twitter / Facebook style cards (built with @JaredTMoskowitz) Follow me on Twitt ...
- 华为HCNP实验 防火墙安全区域及安全策略配置(USG6000)
防火墙安全区域及安全策略配置 一.学习目的 掌握防火墙安全区域的配置方法 掌握安全策略的配置方法 二.拓扑图 三.场景 你是公司的网络管理员.公司总部的网络分成了三个区域,包括 ...
- HDU 3420 -- Bus Fair ACM
Bus Fair Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- 正则表达式 (python 2)
Python提供re模块,包含所有正则表达式的功能.由于Python的字符串本身也用\转义,所以要特别注意: s = 'ABC\\-001' # Python的字符串# 对应的正则表达式字符串变成:# ...
- node-7.2.1 already installed, it's just not linked
直接在terminal下运行以卸载node和nvm: sudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,shar ...