PCon全球产品创新大会(北京站)来啦~了解最新日程 了解详情
写点什么

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

  • 2013 年 1 月 07 日
  • 本文字数:1635 字

    阅读完需:约 5 分钟

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:0029690
用户头像

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

关注

评论

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

TDSQL首次登上腾讯财报!金融机构核心系统落地实现规模化复制

腾讯云数据库

数据库 tdsql

新时代下如何构建TDSQL-C数据库产品

腾讯云数据库

数据库 tdsql

国家质量基础设施(NQI)一站式综合服务平台开发搭建

电微13828808271

作业三总结

Geek_1d37ea

架构训练营

10行代码,撸一个在线个人简历页面!

老表

Python GitHub web开发

8大原则带你秒懂Happens-Before原则

华为云开发者社区

线程 并发 Happens-Bfore Java内存

TDSQL | 多类型数据库统一管理,腾讯云数据库DBhouse工具重磅发布

腾讯云数据库

数据库 tdsql

Findora巧妙的多链协议,帮助DeFi发展更健全

股市老人币圈新

云管理软件哪家好?有哪些功能?咨询电话多少?

行云管家

云计算 云服务 云平台 云资源 云管理

金融级数据库新坐标:腾讯云TDSQL发布全自研新敏态引擎

腾讯云数据库

数据库 tdsql

Moment.js 转换 UTC 格式的 2 个小问题

HoneyMoose

一文帮你掌握TDengine的降采样查询+跨时区统计

TDengine

数据库 tdengine 后端

在SAP云平台的CloudFoundry环境下消费ABAP On-Premise OData服务

Jerry Wang

SAP abap CloudFoundry 11月日更

JDK的第三个LTS版本JDK17来了

程序那些事

程序那些事 11月日更 jdk17 java17

一定要过等保吗?过了等保是不是非常安全?

行云管家

网络安全 等保 堡垒机 等级保护

TypeScript 针对 JavaScript 做了什么

HoneyMoose

云小课 | DSC:快速识别敏感数据并脱敏

华为云开发者社区

华为云 识别 数据脱敏 数据安全中心 敏感数据

100G云服务器诞生记

科技热闻

智联招聘的Web模块扩展落地方案

智联大前端

组件化 SSR

新机遇,拨开证劵企业生态转型迷雾

大咖说

云计算 阿里云 数字化转型 数字化 企业上云

用一个极致简单的场景演练领域建模

神帅

DDD 领域建模

OPPO 图数据库平台建设及业务落地

Nebula Graph

图数据库 知识图谱 图数据库实战 分布式图数据库

模块三作业

Geek_1d37ea

架构训练营

用明道云集成多平台多部门数据,发挥数据分析的力量

明道云

重点人员动态管控系统开发,智慧公安情报研判系统搭建

电微13828808271

Apache Pulsar 荣获中国开源云联盟「2021 优秀开源项目」

Apache Pulsar

大数据 云原生 开源项目 Apache Pulsar 消息系统 Apache Pulsar 社区

架构实战营模块八作业

Geek_d18264

架构实战营

企业采购管理的这些痛点,如何解决?

低代码小观

企业管理 管理系统 管理工具 采购管理 企业采购管理

【Promise 源码学习】第八篇 - 完善 Promise 并通过 promise-aplus-tests 测试

Brave

源码 Promise 11月日更

校招 C++ 大概学习到什么程度?

博文视点Broadview

ABAP Netweaver和git的快捷方式

Jerry Wang

SAP Netweaver CloudFoundry 11月日更

TDSQL前沿技术进展和趋势——数据异常基础理论研究

TDSQL前沿技术进展和趋势——数据异常基础理论研究

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