Hystrix的正确理解方式
hystrix-logo-tagline-640.png
什么是熔断器
熔断器,原本是电路中在电器发生短路时的防止电路过载的开关装置,它切断发生短路的电路,从而防止因电路过载导致的发热起火等灾难的发生。同样的,在为服务中也可能出现类似电路中短路的事故发生,所以为了防止类似的灾难的发生,Hystrix(微服中的熔断器)为此而被设计出来。
官方的定义
以下是官方对hystrix的定义:
In a distributed environment, inevitably some of the many service dependencies will fail. Hystrix is a library that helps you control the interactions between these distributed services by adding latency tolerance and fault tolerance logic. Hystrix does this by isolating points of access between the services, stopping cascading failures across them, and providing fallback options, all of which improve your system’s overall resiliency.
以下是我的翻译:
在分布式环境中,服务之间的调用不可避免地会失败(网络原因、服务器异常等 )。Hystrix是一个在分布式环境中通过增加延迟性和容错来帮助你控制这些服务之间的交互。Hystrix是通过隔离服务之间的访问,阻止服务间的连锁故障,并提供可选项配置,所有这些旨在提高您微服系统的整体弹性。
(以上仅表示我个人的翻译,如果有高见欢迎评论)
Hystrix的历史
Hystrix是由Netflix Api团队的一个开始于2011年提高服务弹性的项目演变而来的,在2012年Hystrix不断的发展和成熟,在Netflix团队中也有越来越多的项目使用到Hystrix.如今,在Netflix每天有成千上万的线程分离和数百亿的信号分离的调用是通过Hystrix完成的。也因此系统的正常运行时间和弹性得到了显著的提高。
Hystrix被设计用来做什么?
提供保护和控制过度的延迟和依赖失败。
在复杂的分布式系统中防止级联失败。
使失败快速结束和快速恢复(Fail fast and rapidly recover)。
回退和尽可能优雅的降级。
提供短近乎实时的监控、警报和操作控制。
Hystrix可以解决什么问题?
在官方文档的介绍中举了一个这样的例子,假设一个应用依赖30个微服务,并且这30个微服的正常运行时间高达99.99%(这对于一个微服来说表现已经很不错了)。这样的情况下,我们能得到这样的结论:
99.99的30次方 = 99.7% 正常运行时间
如果有10亿次请求则有3,000,000次的失败请求
即使所依赖的30个服务都表现很棒,每个月还是有2小时的停机时间
这是在我们假设的依赖的服务表现很棒的情况下,还是会有每月2小时的宕机,在实际的生产环境中情况肯定要比这个更糟糕,尤其对于一些金融或是对服务稳定要求较高的行业,这样的情况是不能允许的。由此可见Hystrix在微服中的重要作用。
如果所有的服务时健康的那么请求的流程如下图:
soa-1-640.png
在流程图中一个关于用户的请求依赖A H I P四个服务,如果这4个服务中有个服务请求超时了,那么这将会导致整个用户请求的阻塞,如果在一秒内有50个以上的这样的请求执行,那么以为意味着会有50个以上的请求在这秒时阻塞的,这将消耗大量的线程。如下图所示:
soa-2-640.png
soa-3-640.png
对于高访问量的服务来说,这个问题会导致,服务的资源在短时间内被耗尽。
当涉及到与第三方后台进行交互时,这些情况会变得更加糟糕。
网络连接失败或降级、服务的失败或变慢、配置或是性能的优化导致的服务的重新部署、客服端库的bug,所有的这些失败或是延迟的问题都需要被隔离和管理从而防止因某个单一的错误拖垮整个微服系统。
Hystrix是依据怎样的设计原则?
防止微服中某个单一服务,消耗掉容器(如 tomcat)的所有用户线程。
减少负载和快速失败而不是排队。
采用隔离技术(如bulkhead, swimlane,和断路器模式)来限制任何一个依赖性的影响。
通过实时指标、监视和警报来优化发现时间。
在打多算方面支持动态特性改变和配置变化的低延迟传播从而达到优化回复时间的目的,所以Hytrix允许您以低延迟反馈循环进行实时操作修改.
保护整个依赖客户端执行中的失败,而不仅仅是在网络流量中。
Hystrix是如何实现这些目标的?
Hystrix 在 HystrixCommand 和 HystrixObservableCommand类 中包装所有的对依赖服务的调用,这些调用通常在一个单独线程中执行。(Hystrix在这用的是“命令模式”的设计模式)
调用时间超过我们设置的超时时间才会被认定为超时,当然超时时间有默认值,但是对于大多数依赖项,您可以通过“属性”来自定义这些超时值,以使它们比每个依赖项的实测99.5%百分点性能略高。
为每个依赖维护一个小的线程池(或信号量);
如果它变满了,发往这个依赖关系的请求将被立即拒绝而不是排队。
衡量成功,失败(客户端抛出的异常),超时和线程拒绝。
跳闸断路器可以在一段时间内停止对特定服务的所有请求,无论是手动还是自动,如果服务的错误百分比超过阈值。
当请求失败被拒绝、超时或短路时执行备用逻辑。
近乎实时的监控指标和配置的更改。
如下如图调用外部的依赖服务必须通过包装的command,然后通过command实现真正的调用。
soa-4-isolation-640.png
Hystrix工作的流程
下图显示了通过Hystrix向依赖服务发出请求的流程
Hystrix的正确理解方式的更多相关文章
- 字符串赋值给字符指针(char *a="hello")的正确理解方式
对于语句 char *a="hello"; 对于这个声明方式,会造成的误解是:声明了一个字符指针(它会指向一个位置),将“字符串”赋值给 指针表达式"*a"所 ...
- Js位置与大小(1)——正确理解和运用与尺寸大小相关的DOM属性
在web开发中,不可避免遇到要计算元素大小以及位置的问题,解决这类问题的方法是利用DOM提供的一些API结合兼容性处理来,所有内容大概分3篇左右的文章的来说明.本文作为第一篇,介绍DOM提供的与尺寸大 ...
- 【转】正确理解PHP程序编译时的错误信息
我们编写程序时,无论怎样小心谨慎,犯错总是在所难免的.这些错误通常会迷惑PHP编译器.如果开发人员无法了解编译器报错信息的含义,那么这些错误信息不仅毫无用处,还会常常让人感到沮丧. 编译PHP脚本时, ...
- 以正确的方式开源 Python 项目
以正确的方式开源 Python 项目 大多数Python开发者至少都写过一个像工具.脚本.库或框架等对其他人也有用的工具.我写这篇文章的目的是让现有Python代码的开源过程尽可能清 晰和无痛.我不是 ...
- 以正确的方式开源 Python 项目(转)
大多数Python开发者至少都写过一个像工具.脚本.库或框架等对其他人也有用的工具.我写这篇文章的目的是让现有Python代码的开源过程尽可能清晰和无痛.我不是简单的指——“创建一个GitHub库,提 ...
- Java进阶(七)正确理解Thread Local的原理与适用场景
原创文章,始自发作者个人博客,转载请务必将下面这段话置于文章开头处(保留超链接). 本文转发自技术世界,原文链接 http://www.jasongj.com/java/threadlocal/ Th ...
- IM开发基础知识补课:正确理解前置HTTP SSO单点登陆接口的原理
1.前言 一个安全的信息系统,合法身份检查是必须环节.尤其IM这种以“人”为中心的社交体系,身份认证更是必不可少. 一些PC时代小型IM系统中,身份认证可能直接做到长连接中(也就是整个IM系统都是以长 ...
- IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列
1.引言 消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一. 消息从发送者到接收者的典型传递方式有两种: 1)一种我 ...
- 正确理解CAP定理
前言 CAP的理解我也看了很多书籍,也看了不少同行的博文,基本每个人的理解都不一样,而布鲁尔教授得定义又太过的简单,没有具体描述和场景案例分析.因此自己参考部分资料梳理了一篇与大家互相分享一下. 标题 ...
随机推荐
- 浅谈virtualenv(虚拟环境)
简介 virtualenv为应用提供了隔离的Python运行环境,解决了不同应用间多版本的冲突问题. 例如: 如果我们要同时开发多个应用程序,那这些应用程序都会共用一个Python,就是安装在系统的P ...
- mytest3.py-api接入平台获取数据
mytest3.py-api接入平台获取数据 import base64 import datetime import hashlib import urllib import urllib.pars ...
- 前端 html border-right: 1px solid red;
后边框 加粗 实体线 红色 border-right: 1px solid red;
- FindBugs——帮助查找隐藏的bug
FindBugs 1.什么是FindBugs FindBugs 是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题.有了静态分析工具,就可以在不实际运行程序 ...
- 汉字转换为拼音的JavaScript库
将JSPinyin剥离mootools这个JavaScript库,可以独立使用. 1)一个是将汉字翻译为拼音,其中每一个字的首字母大写: pinyin.getFullChars(this.value) ...
- zzUbuntu安装配置Qt环境
zz from http://blog.csdn.net/szstephenzhou/article/details/28407417 安装 QT4.8.6库+QT Creator 2.5.0 下载地 ...
- python学习笔记(二十六)经典类和新式类的区别
首先了解一下什么是经典类,什么是新式类 class Person: #经典类 pass class Person2(object): #新式类 pass #类名首字母都大写 #在python3里面经典 ...
- Spring第九弹—使用CGLIIB实现AOP功能与AOP概念解释
JDK自从1.3版本开始,就引入了动态代理,并且经常被用来动态地创建代理,原理之前我已经讲过.JDK的动态代理用起来非常简单,但它有一个限制,就是使用动态代理的对象必须实现一个或多个接口.如果想代理没 ...
- POJ1664:放苹果(线性dp)
题目: http://poj.org/problem?id=1664 Description 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1 ...
- 小程序页面链接-navigator(导航)
navigator-页面链接-通过设置open-type的值来确定页面的打开方式. <view class="btn-area"> <navigator url= ...