Hystrix 是什么?
在分布式系统中,每个服务都可能会调用很多其他服务,被调用的那些服务就是依赖服务,有的时候某些依赖服务出现故障也是很正常的。
Hystrix 可以让我们在分布式系统中对服务间的调用进行控制,加入一些调用延迟或者依赖故障的容错机制。
Hystrix 通过将依赖服务进行资源隔离,进而阻止某个依赖服务出现故障时在整个系统所有的依赖服务调用中进行蔓延;同时 Hystrix 还提供故障时的 fallback 降级机制。
总而言之,Hystrix 通过这些方法帮助我们提升分布式系统的可用性和稳定性。
Hystrix 的历史
Hystrix 是高可用性保障的一个框架。Netflix(可以认为是国外的优酷或者爱奇艺之类的视频网站)的 API 团队从 2011 年开始做一些提升系统可用性和稳定性的工作,Hystrix 就是从那时候开始发展出来的。
在 2012 年的时候,Hystrix 就变得比较成熟和稳定了,Netflix 中,除了 API 团队以外,很多其他的团队都开始使用 Hystrix。
时至今日,Netflix 中每天都有数十亿次的服务间调用,通过 Hystrix 框架在进行,而 Hystrix 也帮助 Netflix 网站提升了整体的可用性和稳定性。
2018 年 11 月,Hystrix 在其 Github 主页宣布,不再开放新功能,推荐开发者使用其他仍然活跃的开源项目。维护模式的转变绝不意味着 Hystrix 不再有价值。相反,Hystrix 激发了很多伟大的想法和项目,我们高可用的这一块知识还是会针对 Hystrix 进行讲解。
Hystrix 的设计原则
举个栗子。
有这样一个分布式系统,服务 A 依赖于服务 B,服务 B 依赖于服务 C/D/E。在这样一个成熟的系统内,比如说最多可能只有 100 个线程资源。正常情况下,40 个线程并发调用服务 C,各 30 个线程并发调用 D/E。
调用服务 C,只需要 20ms,现在因为服务 C 故障了,比如延迟,或者挂了,此时线程会 hang 住 2s 左右。40 个线程全部被卡住,由于请求不断涌入,其它的线程也用来调用服务 C,同样也会被卡住。这样导致服务 B 的线程资源被耗尽,无法接收新的请求,甚至可能因为大量线程不断的运转,导致自己宕机。这种影响势必会蔓延至服务 A,导致服务 A 也跟着挂掉。
Hystrix 可以对其进行资源隔离,比如限制服务 B 只有 40 个线程调用服务 C。当此 40 个线程被 hang 住时,其它 60 个线程依然能正常调用工作。从而确保整个系统不会被拖垮。
Hystrix 更加细节的设计原则
往期回顾:
【Java问答学堂】1期 为什么使用消息队列?消息队列有什么优点和缺点?Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别,以及适合哪些场景?
【Java问答学堂】3期 如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性?
【Java问答学堂】4期 如何保证消息的可靠性传输?(如何处理消息丢失的问题?)
【Java问答学堂】6期 如何解决消息队列的延时以及过期失效问题?
【Java问答学堂】7期 如果让你写一个消息队列,该如何进行架构设计?
【Java问答学堂】8期 es 的分布式架构原理能说一下么(es 是如何实现分布式的啊)?
【Java问答学堂】9期 es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?
【Java问答学堂】10期 es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?
【Java问答学堂】11期 es 生产集群的部署架构是什么?每个索引的数据量大概有多少?
【Java问答学堂】12期 项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果?
【Java问答学堂】13期 redis 和 memcached 有什么区别?
【Java问答学堂】14期 redis 都有哪些数据类型?分别在哪些场景下使用比较合适?
【Java问答学堂】15期redis 的过期策略都有哪些?内存淘汰机制都有哪些?
【Java问答学堂】16期如何保证 redis 的高并发和高可用?redis 的主从复制原理能介绍
Kafka、ActiveMQ、RabbitMQ、RocketMQ的区别?【Java问答学堂】19期
如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性?【Java问答学堂】21期
如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题?【Java问答学堂】22期
如何解决消息队列的延时以及过期失效问题?【Java问答学堂】24期
如果让你写一个消息队列,该如何进行架构设计?【Java问答学堂】25期
ES 的分布式架构原理能说一下么(ES 是如何实现分布式的啊)?【Java问答学堂】26期
ES 写入数据的工作原理是什么啊?ES 查询数据的工作原理是什么啊?【Java问答学堂】27期
ES 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?【Java问答学堂】28期
ES 生产集群的部署架构是什么?每个索引的数据量大概有多少?【Java问答学堂】29期
项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果?【Java问答学堂】30期
Redis 和 Memcached 的区别?Redis 的线程模型是什么?【Java问答学堂】31期
Redis 都有哪些数据类型?分别在哪些场景下使用比较合适?【Java问答学堂】32期
Redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现?【Java问答】33期
如何保证 redis 的高并发和高可用?【Java问答】34期
Redis 集群模式的工作原理能说一下么?【Java问答】36期
了解什么是 Redis 的雪崩、穿透和击穿?Redis 崩溃之后会怎么样?【Java问答】37期
Redis 的并发竞争问题是什么?如何解决这个问题?【Java问答】39期
生产环境中的 Redis 是怎么部署的?【Java问答】40期
为什么要分库分表(设计高并发系统的时候,数据库层面该如何设计)?【Java问答】41期
如何设计才可以让系统从未分库分表动态切换到分库分表上?【Java问答】42期
你们有没有做 MySQL 读写分离?如何实现 MySQL 的读写分离?【Java问答】44期
为什么要进行系统拆分?如何进行系统拆分?拆分后不用 dubbo 可以吗?【Java问答学堂】46期
dubbo 的工作原理?注册中心挂了的问题?说说一次 rpc 请求的流程?【Java问答】47期
dubbo 支持的通信协议?有哪些序列化协议?说下 Hessian 的数据结构?【Java问答】48期
dubbo 负载均衡策略和集群容错策略都有哪些?动态代理策略呢?【Java问答学堂】49期
dubbo 的 spi 思想是什么?【Java问答学堂】50期
如何基于 dubbo 进行服务治理、服务降级、失败重试以及超时重试?【Java问答学堂】51期
分布式服务接口的幂等性如何设计(比如不能重复扣款)?【Java问答学堂】52期
分布式服务接口请求的顺序性如何保证?【Java问答学堂】53期
如何自己设计一个类似 Dubbo 的 RPC 框架?【Java问答学堂】54期
分布式系统 CAP 定理 P 代表什么含义【Java问答学堂】55期
zookeeper 都有哪些使用场景?【Java问答学堂】56期
一般实现分布式锁都有哪些方式?使用 Redis 如何设计分布式锁?使用 zk 来设计分布式锁可以吗?这两种分布式锁的实现方式哪种效率比较高?【Java问答学堂】57期
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。