Hystrix 介绍

Hystrix 是什么



在分布式系统,我们一定会依赖各种服务,那么这些个服务一定会出现失败的情况,Hystrix就是这样的一个工具,它通过提供了逻辑上延时和错误容忍的解决力来协助我们完成分布式系统的交互。Hystrix 通过分离服务的调用点,阻止错误在各个系统的传播,并且提供了错误回调机制,这一系列的措施提高了系统的整体服务弹性。

Hystrix 的历史

Hystrix 是2011 从Netflix API 团队发展而来。 2012 Hystrix持续发展并且成熟,并且有非常多的团队开始采用Hystrix.现在在Netflix每天有数十万的线程,数百万的独立信号量通过Hystrix执行,这几大增强了服务的弹性和服务时间。

Hystrix 是干嘛的



Hystrix 被设计用来做了下面几件事:

  • 保护系统间的调用延时以及错误,特别是通过第三方的工具的网络调用
  • 阻止错误在分布式系统之前的传播
  • 快速失败和迅速恢复
  • 错误回退和优雅的服务降级
  • 提供近乎实时的系统监控,报警和动态操控

Hystrix 解决了什么问题



应用在复杂的分布式系统中存在非常多的依赖,这其中一些服务不可避免的会失败,如果主应用程序没有和依赖的服务隔离开来,那么它的服务成功率就会下降

举个例子, 一个服务依赖30个不同的服务,每个服务的服务成功率为99.99%,这个服务的成功率就可以这样计算:

99.99*99.99。。。。。30 = 99.7 这样算来 1000个请求中就有3个是失败的, 这样一来 每个月基本上会有差不多2个小时的停机时间

这只是一个计算值,现实情况可以比这个更糟糕

尽管我们我们可以将每个服务的成功率再往上提升,比如现在没1万个请求才会失败一个,但是还是任然每个月了数小时的停机,



当每个服务都是健康的时候,服务间的依赖调用关系如下图:

当其中的某一个服务变得延时较大时,这个服务将成为系统的瓶颈:

当有大量的网络流量依赖于一个后端的服务时,瞬间就会导致整个系统的资源都受到影响.

在应用程序中,每一个通过网络或者使用第三方客户端发送出去的请求都有可能会失败,比失败更糟糕的是,这会增加服务间的调用延时。

上面的这些问题会变得更加的严重,当我们通过第三方客户端发送网络请求,因为第三方客户端对于我们而言是“黑盒”,并且它的实现是随时可能改变的。并且每一个客户端的资源配置都是不同的,这样就非常的难监控和改变。

。。。。。。

网络连接失败或者降级,服务或者服务机器停机或者变慢,新的客户端或者部署的新的服务改变了原有的行为,亦或者客户端有bugs。

上面的所有错误形式都需要被单独隔离出来,这样不至于一个简单的错误导致整个系统的失败。

Hystrix 的设计原则是什么



Hystrix工作方式如下:

  • 阻止一个单独的依赖耗尽系统的所有线程,比如(tomcat)
  • 使用快速失败代替将这个请求排队
  • 在任何可能失败的地方提供后退机制来确保用户不会看到错误
  • 使用隔离技术(比如:隔板,泳道,环路切断 模式)降低一个依赖的失败对整个系统的影响
  • 优化使得系统可以近乎实时的收集,监控,报警
  • 优化使得系统可以近乎实时的修改,并且可以近乎实时生效
  • 保护系统不仅仅在网络层面,也包括客户端层面的依赖执行的失败

Hystrix 是怎样的实现这些目标

Hystrix 通过如下的方式实现了这些目标:

  • 通过使用命令模式包装所有的调用外部系统的请求,这些个请求都单独的运行在不同的线程中,在Hystrix中主要通过 "HystirxCommand","HystixObservableCommand"实现
  • 调用超时比我们自定义的超时时间更久,所以我们在使用的过程中最好自定义网络调用的超时时间,在Hystrix中,提供了配置可以修改默认的超时时间,那么超时间到底应该定义为多少? 就一般经验值而言,设置为服务成功率为99.5%时的平均时间
  • 每一个服务都维护着一个小的线程池或者信号量,一旦线程池或者信号量饱和了,那么采取的策略是拒绝请求而不是将请求排队
  • 记录成功,失败,超时,线程拒绝数据
  • 提供一个回调接口,当一个请求失败,或者被拒绝,超时亦或者因为短路而拒绝
  • 监控系统运行数据并且可以近乎实时的修改系统配置
  • 一段时间内当短路发生时,拒绝所有的请求,或者当错误率超过了阀值

当你使用Hystrix包装所有的依赖时,系统的整体架构和上面的那张图差不多一致的,每一个依赖之间都是相互隔离的,这样可以为每一服务提供失败回滚逻辑等等。

时间: 2024-08-03 22:22:10

Hystrix 介绍的相关文章

使用Netflix Hystrix编写弹性可容错的应用程序

弹性指的是在复杂网络环境下,面对各种故障和挑战,仍能提供和维持一个可以接受的服务水平,并正常运作. -来自Wikipedia 自从长期服务和最近的微服务被大家熟知和使用,很多应用程序开发人员已经将整体式的API,转换成简单的.功能单一的微服务.然而,这样的转换,导致为了保证一致的响应时间和弹性,依赖关系变得不可用时,造成额外的损耗.例如,一个单体式的web应用程序,执行一次重试,在一定程度上是弹性的,因为它可以在某些依赖关系(如数据库或其他服务)不可用时恢复.这种恢复能力没有任何附加的网络损耗或

王新栋 | Hystrix技术解析

一.认识Hystrix Hystrix是Netflix开源的一款容错框架,包含常用的容错方法:线程池隔离.信号量隔离.熔断.降级回退.在高并发访问下,系统所依赖的服务的稳定性对系统的影响非常大,依赖有很多不可控的因素,比如网络连接变慢,资源突然繁忙,暂时不可用,服务脱机等.我们要构建稳定.可靠的分布式系统,就必须要有这样一套容错方法. 本文将逐一分析线程池隔离.信号量隔离.熔断.降级回退这四种技术的原理与实践. 二.线程隔离 2.1为什么要做线程隔离 比如我们现在有3个业务调用分别是查询订单.查

从Netflix的Hystrix框架理解服务熔断和服务降级

本文讲的是从Netflix的Hystrix框架理解服务熔断和服务降级,伴随着微服务架构被宣传得如火如荼,一些概念也被推到了我们面前,其实大多数概念以前就有,但很少被提的这么频繁.想起有人总结的一句话,微服务架构的特点就是:"一解释就懂,一问就不知,一讨论就吵架". 其实对老外的总结能力一直特别崇拜,Kevin Kelly.Martin Fowler.Werner Vogels--,都是著名的"演讲家".正好这段时间看了些微服务.容器的相关资料,也在我们新一代产品中进

springcloud(四):熔断器Hystrix

熔断器 雪崩效应 在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应.服务雪崩效应是一种因"服务提供者"的不可用导致"服务消费者"的不可用,并将不可用逐渐放大的过程. 如果下图所示:A作为服务提供者,B为A的服务消费者,C和D是B的服务消费者.A不可用引起了B的不可用,并将不可用像滚雪球一样放大到C和D时,雪崩效应就形成了. 熔断器(CircuitBreaker) 熔断器的原理很简单,如同

PhotoShop中正片负片叠底的原理介绍

关于正片叠底,正片,负片,通道,色相,色相环等等的相关理论一堆,大家可以从网上查到,原理就不讲了. 感觉单通道正片叠底效果应该属于填充色一类,但却与填充色又有很大的差异,与照片滤镜功能也有所差异,运用得当,最大的优点是在叠底后仍能保持比较好的照片通透度,而且简单易用,特别适合不太熟悉PS操作的朋友,此类方法运用广泛,配合起来使用比较方便,慢慢介绍吧. photoshop教程注:以下介绍的为RGB模式下的叠底,与CMYK模式下有所区别 方法一,单通道正片叠底 例一,叠出阳光色.提示:图片应尽量少漏

PS蒙版详细介绍

教程像飞特的朋友们介绍PS的蒙版原理和实例的运用,蒙版,通道,历史记录,图层样式,混合模式(已经开篇讲解了),智能对象,智能滤镜,嵌入图层,动作,其它,后期我针对这些,讲讲应用,希望大家有更深的感受.享受学习理论的乐趣. 先从蒙版说起吧. 讲到蒙版,要先了解下蒙版的由来.相信你一定能深刻领悟蒙版的使用技巧,看下提纲: 1,蒙版的由来 2,快速蒙版与选区 3,图层蒙版 4,PS CS5的蒙版新用法 一,蒙版的由来 犹记当年计划生育推行的时候,墙上,电线杆上,到处都是大红标语,如"计划生育好&quo

andriod平台"点九" .9.png设计介绍

"点九"是andriod平台的应用软件开发里的一种特殊的图片形式,文件扩展名为:.9.png 智能手机中有自动横屏的功能,同一幅界面会在随着手机(或平板电脑)中的方向传感器的参数不同而改变显示的方向,在界面改变方向后,界面上的图形会因为长宽的变化而产生拉伸,造成图形的失真变形. 我们都知道android平台有多种不同的分辨率,很多控件的切图文件在被放大拉伸后,边角会模糊失真. OK,在android平台下使用点九PNG技术,可以将图片横向和纵向同时进行拉伸,以实现在多分辨率下的完美显示

Python中字典的基本知识初步介绍

  这篇文章主要介绍了Python中字典的基本知识初步介绍,是Python入门中的基础知识,需要的朋友可以参考下 字典是可变的,并且可以存储任意数量的Python对象,包括其他容器类型另一个容器类型.字典包括键对(称为项目)及其相应的值. Python字典也被称为关联数组或哈希表.字典的一般语法如下: ? 1 dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'} 可以用下面的方式创建字典: ? 1 2 dict1 = { 'abc':

简单介绍Python2.x版本中的cmp()方法的使用

  这篇文章主要介绍了简单介绍Python2.x版本中的cmp()方法的使用,然而该方法在Python3.x版本中已并不再内置...需要的朋友可以参考下 cmp()方法比较两个列表的元素. 语法 以下是cmp()方法的语法: ? 1 cmp(list1, list2) 参数 list1 -- 这是要进行比较的第一个列表 list2 -- 这是要进行比较的第二个列表 返回值 如果元素是相同类型的,执行比较,并返回结果.如果元素是不同的类型,检查,看看他们是否是数字 如果是数字必要时强制进行数字比较