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-command-flow-chart.png

点击查看大图

总结

这篇文章其实大部分是依据官方文档对Hystrix的介绍来写的,当中有我个人的理解,也可以把它作为官方介绍的中文版翻译来看。文章中如有错误的地方欢迎留言,如果觉得这篇文章对您有用,欢迎点赞。

参考

Hystrix官方文档介绍 https://github.com/Netflix/Hystrix/wiki

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

推荐阅读更多精彩内容