hystrix应用介绍(一)
声明:本文仅做个人的一次接口重构过程记录,期间参考了一些写的不错的博客,如果存在抄袭,请留言。
hystrix基本介绍
hystrix 是一个开源的容灾框架,目的是为了解决当依赖服务出现故障或者接口响应时间较慢,拖慢调用方业务系统,甚至引起系统雪崩的问题。
hystrix隔离分析
hystrix 有两种隔离方式,线程隔离,信号量的方式
(1)线程隔离
把执行依赖代码的线程与请求线程(如:jetty线程)分离,请求线程可以自由控制离开的时间(异步过程)。
通过线程池大小可以控制并发量,当线程池饱和时可以提前拒绝服务,防止依赖问题扩散。
线上建议线程池不要设置过大,否则大量堵塞线程有可能会拖慢服务器。
线程隔离的优缺点
- 线程隔离的优点:
[1]:使用线程可以完全隔离第三方代码,请求线程可以快速放回。
[2]:当一个失败的依赖再次变成可用时,线程池将清理,并立即恢复可用,而不是一个长时间的恢复。
[3]:可以完全模拟异步调用,方便异步编程。
- 线程隔离的缺点:
[1]:线程池的主要缺点是它增加了cpu,因为每个命令的执行涉及到排队(默认使用SynchronousQueue避免排队),调度和上下文切换。
[2]:对使用ThreadLocal等依赖线程状态的代码增加复杂性,需要手动传递和清理线程状态。
- NOTE: Netflix公司内部认为线程隔离开销足够小,不会造成重大的成本或性能的影响。
- Netflix 内部API 每天100亿的HystrixCommand依赖请求使用线程隔,每个应用大约40多个线程池,每个线程池大约5-20个线程。
(2)信号隔离
- 信号隔离也可以用于限制并发访问,防止阻塞扩散, 与线程隔离最大不同在于执行依赖代码的线程依然是请求线程(该线程需要通过信号申请),
- 如果客户端是可信的且可以快速返回,可以使用信号隔离替换线程隔离,降低开销.
- 信号量的大小可以动态调整, 线程池大小不可以.
线程隔离与信号隔离区别如下图:
上图可以看出,左边是线程池隔离,由主线程调用依赖后,依赖服务的执行是在新的HystrixCommand线程池中执行的,右边图中展示,信号量的方式,代码的执行还是在主线程中执行的。
实际hystrix应用场景介绍
现在大部分应用系统都是采用的分布式框架,系统中会有很多的依赖,HTTP、Dubbo、hession等等,在高并发场景下,这些依赖的服务稳定性对系统的影响很大,当依赖阻塞时,大多数服务器的线程池就出现阻塞(BLOCK),拖慢整条链路业务的执行,影响整个线上服务的稳定性,如果没有对依赖的服务做隔离就会出现这样的场景:
某次大直播中(我是做直播的)通过监控发现某个接口RT猛增,通过pinpoint看到是依赖的一个接口响应时间比平时慢了很多,分析问题,该接口RT增加可能是因为依赖的下层接口响应时间变慢,大量请求都阻塞在接口调用处,还有个问题,该接口的dubbo超时时间设置的1秒,1秒,1秒。。。。那这个接口影响1.2秒一点不奇怪,依赖接口都执行了1秒才会返回超时,问题分析到,接下来就是进行优化了。
优化过程
由于代码是别的同学写的,接口优化又迫在眉睫,上面只是举例实际还有别的问题,只是说明一下应用场景,根据实际情况我做了一个代码优化的方案
阶段一:尽可能少动,因为这个接口属于核心接口一旦出现问题可能影响较大(灰度发布的事,这里先不提,以后有时间会专门做一项关于灰度上线,灰度测试等,相关的文档,背锅是不可能背锅的),梳理出接口依赖的第三方服务,根据业务将所有依赖进行了划分,分出三个线程池,第一个核心线程池,该线程池用来处理观看直播所需的一些必须信息,比如直播流地址,主播信息等等,
第二个线程池,存放一些内部依赖的dubbo服务调用,第三个线程池,存放一些调用微博,淘宝等一些http服务
为什么这么优化
可能很多人看到上边会有很多疑问,hystrix不是用来做依赖服务的熔断隔离吗?你这把所有的依赖调用都放到一个线程池子意义何在?这里有必要说一些,上边说过了不了解代码阶段一优化不想改动太多逻辑,单纯的对接口做隔离,保证核心线程容量,非核心线程直接熔断或者干脆不调用对观看直播不会产生影响,这也是对于突发大流量时,业务上的优化,非核心功能可以降级,只保证核心功能(淘宝双十一也是一样)
还有个问题,既然核心线程的接口优先保证容量,那为什么还要单独交给新的线程池去处理,为什么不在主线程中执行呢?主线程在调用核心线程中的逻辑时一样是阻塞在那里,还会增加线程池之间的上下文切换时间,这里也不见得没有好处,我把核心代码隔离出来就可以精准的评估出我接口单台服务器能抗的最大并发数,这样在做容量保障时,就可以根据多少qps评估出要扩多少台机器。其实就是两者之间做一个取舍。
阶段二优化
上边说了第一阶段的优化过程,通过第一阶段优化经历,基本了解代码中有哪些逻辑了,第二阶段准备做数据聚合,什么意思呢,上边说过咱们这个接口调用了太多了的服务,通过阶段一的优化我们已经将该异步的接口做了异步,既然我们做了异步降级,那么也就是说非核心接口以为的数据我们可以尝试提前将这部分数据查询出来拼接好放到某一个容器里边,我们需要的时候之间从该容器中获取,获取不到就直接返回null结果(类似阶段一接口熔断了),由于还没有进行到阶段二这里先这这么多,给大家提供一个优化思路,仅供参考
参考文章:http://www.importnew.com/25704.html
hystrix应用介绍(一)的更多相关文章
- hystrix基本介绍和使用(1)
一.hystrix基本介绍 Hystrix(https://github.com/Netflix/Hystrix)是Netflix(https://www.netflix.com/global)的一个 ...
- Hystrix的介绍和简单使用
这周在看项目的相关代码时,接触到了Hystrix,因此查询了相关资料学习了下. 一.什么是Hystrix Hystrix是Netflix针对微服务分布式系统的熔断保护中间件,当我们的客户端连接远程的微 ...
- Hystrix简单介绍
Netflix的Hystrix是一个帮助解决分布式系统交互超时处理和容错的类库,同样拥有保护系统的能力. 服务隔离 服务降级 1.服务隔离 在一个系统中,一个业务通常会依赖多个服务,且这若干个服务的调 ...
- hystrix应用介绍(四)
前几章已经讲了hystrix的应用场景,以及如何使用,本章我们针对如何进行hystrix参数配置做一些分析 //异步的执行 @HystrixCommand(groupKey = "testK ...
- hystrix应用介绍(三)
hystrix提供了两种隔离策略:线程池隔离和信号量隔离.hystrix默认采用线程池隔离. 1.线程池隔离 不同服务通过使用不同线程池,彼此间将不受影响,达到隔离效果. 例如: 我们可以通过andT ...
- hystrix应用介绍(二)
上篇博客中讲了hystrix在公司中的一些应用场景,由于保密的原因没办法贴出优化的代码,这里专门写一篇hystrix代码的demo,供大家在使用的过程中快速上手 Hystrix有两个请求命令 Hyst ...
- Hystrix的介绍(断路、降级)
在大中型分布式系统中,通常系统很多依赖(HTTP,hession,Netty,Dubbo等),如下图: 在高并发访问下,这些依赖的稳定性与否对系统的影响非常大,但是依赖有很多不可控问题:如网络 ...
- Hystrix介绍以及服务的降级限流熔断
(dubbo熔断,Hystrix问的少) 无论是缓存层还是存储层都会有出错的概率,可以将它们视同为资源.作为并发量较大的系统,假如有一个资源不可用,可能会造成线程全部 hang (挂起)在这个资源上, ...
- 【第十九章】 springboot + hystrix(1)
hystrix是微服务中用于做熔断.降级的工具. 作用:防止因为一个服务的调用失败.调用延时导致多个请求的阻塞以及多个请求的调用失败. 1.pom.xml(引入hystrix-core包) 1 < ...
随机推荐
- MySQL 5.0的my.cnf配置选项(另外一种方式分类整理)
一. mysqld程序--目录和文件 basedir = path 使用给定目录作为根目录(安装目录). Show variables like “basedir” //数据库中查看目录 da ...
- EXTJs前后台交互 常用哦3种方式
<1>Ajax交互方式 Ext.Ajax.request( { //被用来向服务器发起请求默认的url url : "", //请求时发送后台的参数,既可以是Json对 ...
- Crontab 驱动 Scrapy 定时任务
做了个爬虫去定时抓自己发布在cnblogs更新的文章,考虑用corntab定时任务驱动 crontab 任务配置 crontab配置规则就不啰嗦了,网上很多介绍,规则很容易功能却很强大. 然后我发现只 ...
- ASP前端控件设置只读不要用enabled
会导致后台取不到这个控件的值,应该用readonly
- hdu1845(a^b的因子和%p)
题目链接:http://poj.org/problem?id=1845 思路: 1.整数唯一分解定理: 任意正整数都有且只有一种方式写出其素因子的乘积表达式. a=(p1^k1)*(p2^k2)*(p ...
- (vue.js)import "mint-ui/lib/stylecss"失败
在vue2.0中引入了mint-ui后总是报一个css的错误 但是package.json中已经配置了css-loader style-loader ,webpack.config中也已经配置了css ...
- P1556 幸福的路
题意:平面内有N头牛$N\le 10$john从(0,0)出发,最后回到(0,0) 只有走到牛那里john才可以改变方向,否则沿着直线走 问john经过每一头牛并且在每一头牛出恰好改变方向一次的方案( ...
- [WebShow系列] 需求及环境的确定
需求及环境确定: 主题标语 选手人数 评委人数 打分方式 合计算法 名次算法 大屏数量 大屏分辨率 电脑配置 切换设备 评委人员配备 技术人员配备 现场网速情况 评委移动端配备 场次数量 场次时间 选 ...
- Python文件操作,异常语法
1.文件 2.异常 1.文件的输入输出 #1.打开文件 open 函数open(file,[option])#file 是要打开的文件#option是可选择的参数,常见有 mode 等#2.文件的打 ...
- Codeforces Round #334(div.2)(新增不用二分代码) B
B. More Cowbell time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...