前端未来的主流技术方向有哪些?腾讯、京东、同城旅行等大厂都是怎么布局的?戳此了解 了解详情
写点什么

Netflix Hystrix — 应对复杂分布式系统中的延时和故障容错

2013 年 1 月 07 日

Netflix 近日发布了 Hystrix ,该库旨在通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix 具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包(request collapsing,即自动批处理,译者注),以及监控和配置等功能。Hystrix 源于 Netflix API 团队在 2011 年启动的弹性工程工作,而目前它在 Netflix 每天处理着数百亿的隔离线程以及数千亿的隔离信号调用。Hystrix 是基于 Apache License 2.0 协议的开源的程序库,目前托管在 GitHub 上。

复杂分布式架构通常都具有很多依赖。如果一个应用不能对来自依赖的故障进行隔离,那该应用本身就处在被拖垮的风险中。在一个高流量的网站中,某个单一的后端一旦发生延迟,将会在数秒内导致所有应用资源被耗尽。

Hystrix 对来自依赖的延迟和故障进行防护和控制——这些依赖通常都是通过网络访问的。这样可以阻止故障的连锁反应,并允许你快速失败并迅速恢复,或者回退并优雅降级。

下面将显示 Hystrix 是如何工作的。你需要在 HystrixCommand 对象中对依赖调用进行包装。HystrixCommand 遵照命令模式,而且通常都是在一个单独的线程中执行。当一次调用耗时超过了预定义的阈值时,一个超时事件将发生。Hystrix 为每个依赖都维护着一个线程池(信号),如果线程池被耗尽它将拒绝请求(而不是让请求排队)。它提供断路器功能以阻止所有对某依赖的请求。当请求失败、被拒绝、超时或短路时,你也可以用代码实现回退的逻辑。Hystrix 同样支持请求缓存和请求打包。

这是 HystrixCommand 一个简单的 Hello World 实现。

复制代码
public class HelloWorldCommand extends HystrixCommand {
public HelloWorldCommand() {
super(HystrixCommandGroupKey.Factory.asKey("MyGroup"));
}
@Override
protected String run() {
return "Hello World";
}
@Override
protected String getFallback() {
return "Hello Fallback";
}
}

出于对报告和提醒的目的,group 这个键用于对命令进行分组。可以通过添加 getFallback() 实现来达到优雅降级的目的,所有类型的故障都可以触发 getFallback(),比如异常,超时,线程池(信号)拒绝和断路器短路。Hystrix 命令可以用 execute() 方法同步(synchronously)执行。

复制代码
String s = new HelloWorldCommand().execute();

Hystrix 命令也可以用 queue() 方法异步(asynchronously)执行。

复制代码
java.util.concurrent.Future future = new HelloWorldCommand().queue();
String s = future.get();

Hystrix 使用舱壁模式(bulkhead pattern)来隔离依赖和限制并发访问。每个依赖使用独立的线程池以保证并发请求是受约束的。底层执行的延迟将只会在对应线程池中耗尽所有的可用线程。使用信号来取代线程池也是一种选择,这样可以进行降载(load shedding)而非超时。针对使用线程池处理依赖这一方式的利弊的深度讨论,请进一步阅读 Hystrix 隔离性是如何工作的

Hystrix 提供了一个监控的控制面板,该面板和 Netflix 内部使用的是一模一样的。 Hystrix 控制面板提供了近实时的监控,提醒和操作控制。它显示成功,故障(由客户端抛出的异常),超时和线程拒绝。用户可以动态的修改配置,比如手动短路某个依赖。

想要开始使用 Hystrix 的话,请访问 Hystrix 的文档 http://github.com/Netflix/Hystrix/wiki ,这里包含了入门指南使用方法。你需要安装Java6 或更新版本的Java。Maven 用户可以查找Maven 工件:com.netflix.hystrix hystrix-core。更多的信息,请阅读 Netflix API 性能和故障容错介绍以及官方的 Hystrix FAQ 。需要注意的是在本文撰写时,Hystrix 对异步依赖的支持尚未被实现。

查看英文原文 Netflix Hystrix - Latency and Fault Tolerance for Complex Distributed Systems


感谢杨赛对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2013 年 1 月 07 日 09:0029571
用户头像

发布了 52 篇内容, 共 20.3 次阅读, 收获喜欢 5 次。

关注

评论

发布
暂无评论
发现更多内容

基于Docker部署MySQL8集群(一主二从)

互联网架构师小马

在腾讯,我的试用期总结

程序员鱼皮

Java c++ Python 前端 后端

CTF中的一些常见骚操作(可以没有,但不能不会)

网络安全学海

网络安全 信息安全 CTF 渗透测试 漏洞分析

什么是TCP/IP,它是怎么工作的,几张图就这样总结了,建议收藏!

代码熬夜敲

网络安全 计算机网络 网络协议 信息安全 渗透测试

宫瑞婷系统开发详情

I3I I3I2 6989微电同号

新私域小程序系统开发详情

I3I I3I2 6989微电同号

思购臻选拼团系统开发详情

I3I I3I2 6989微电同号

华蒸掌柜拼团系统开发详情

I3I I3I2 6989微电同号

玫莉蔻系统开发案例

I3I I3I2 6989微电同号

黔唐百宜拼团系统开发

I3I I3I2 6989微电同号

言蕾回春面具系统开发详情

I3I I3I2 6989微电同号

Windows Print Spooler服务最新漏洞CVE-2021-34527详细分析

H

网络安全 安全 网络 漏洞分析

奇易时光冷敷凝胶系统开发案例

I3I I3I2 6989微电同号

大数据训练营-0711课后作业

cc

【涨知识】你不知道的Python常用开发工具!猿来这么多!

小阿杰

Python 后端 开发工具

RabbitMQ消息可靠性投递分析

互联网架构师小马

薇丝顿美牙系统开发详情

I3I I3I2 6989微电同号

买团团商城系统开发案例

I3I I3I2 6989微电同号

小解c# foreach原理

喵叔

7 月日更

[架构实战营]模块二作业

xyu

#架构实战营

免费分享Mysql从入门到精通的优秀图书

Java入门到架构

想在Java八股文面试中脱颖而出?这《1000道互联网大厂Java工程师面试题》必不可少!

Java 白

Java 编程 程序员

勇于尝试新鲜事物,利于项目来积累学习经验

DisonTangor

职业规划

宅拼多拼团系统开发案例

I3I I3I2 6989微电同号

链尚水晶拼团系统开发详情

I3I I3I2 6989微电同号

抖音新私域小程序开发详情

I3I I3I2 6989微电同号

乐氏同仁新零售系统开发案例

I3I I3I2 6989微电同号

用舍轻奢优选系统开发案例

I3I I3I2 6989微电同号

想在Java八股文面试中脱颖而出?这《1000道互联网大厂Java工程师面试题》必不可少!

白亦杨

Java 编程 程序员

从脑瘫患者重获交流到免开颅微创,脑机接口更安全了吗?

脑极体

美人荟商城系统开发案例

I3I I3I2 6989微电同号

技术为帆,纵横四海- Lazada技术东南亚探索和成长之旅

技术为帆,纵横四海- Lazada技术东南亚探索和成长之旅

Netflix Hystrix — 应对复杂分布式系统中的延时和故障容错-InfoQ