声明:本文仅做个人的一次接口重构过程记录,期间参考了一些写的不错的博客,如果存在抄袭,请留言。

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应用介绍(一)的更多相关文章

  1. hystrix基本介绍和使用(1)

    一.hystrix基本介绍 Hystrix(https://github.com/Netflix/Hystrix)是Netflix(https://www.netflix.com/global)的一个 ...

  2. Hystrix的介绍和简单使用

    这周在看项目的相关代码时,接触到了Hystrix,因此查询了相关资料学习了下. 一.什么是Hystrix Hystrix是Netflix针对微服务分布式系统的熔断保护中间件,当我们的客户端连接远程的微 ...

  3. Hystrix简单介绍

    Netflix的Hystrix是一个帮助解决分布式系统交互超时处理和容错的类库,同样拥有保护系统的能力. 服务隔离 服务降级 1.服务隔离 在一个系统中,一个业务通常会依赖多个服务,且这若干个服务的调 ...

  4. hystrix应用介绍(四)

    前几章已经讲了hystrix的应用场景,以及如何使用,本章我们针对如何进行hystrix参数配置做一些分析 //异步的执行 @HystrixCommand(groupKey = "testK ...

  5. hystrix应用介绍(三)

    hystrix提供了两种隔离策略:线程池隔离和信号量隔离.hystrix默认采用线程池隔离. 1.线程池隔离 不同服务通过使用不同线程池,彼此间将不受影响,达到隔离效果. 例如: 我们可以通过andT ...

  6. hystrix应用介绍(二)

    上篇博客中讲了hystrix在公司中的一些应用场景,由于保密的原因没办法贴出优化的代码,这里专门写一篇hystrix代码的demo,供大家在使用的过程中快速上手 Hystrix有两个请求命令 Hyst ...

  7. Hystrix的介绍(断路、降级)

    在大中型分布式系统中,通常系统很多依赖(HTTP,hession,Netty,Dubbo等),如下图:     在高并发访问下,这些依赖的稳定性与否对系统的影响非常大,但是依赖有很多不可控问题:如网络 ...

  8. Hystrix介绍以及服务的降级限流熔断

    (dubbo熔断,Hystrix问的少) 无论是缓存层还是存储层都会有出错的概率,可以将它们视同为资源.作为并发量较大的系统,假如有一个资源不可用,可能会造成线程全部 hang (挂起)在这个资源上, ...

  9. 【第十九章】 springboot + hystrix(1)

    hystrix是微服务中用于做熔断.降级的工具. 作用:防止因为一个服务的调用失败.调用延时导致多个请求的阻塞以及多个请求的调用失败. 1.pom.xml(引入hystrix-core包) 1 < ...

随机推荐

  1. MySQL Index Condition Pushdown 原理与解析

    Index Condition Pushdown(ICP)是针对mysql使用索引从表中检索行数据时的一种优化方法.   原理: 在没有ICP特性之前,存储引擎根据索引去基表查找并将数据返回给mysq ...

  2. 【转】在Asp.net前台和后台弹出提示框

    源地址:http://blog.sina.com.cn/s/blog_5200dd680100mkk0.html

  3. winform只能打开一个子窗口

    源地址:https://zhidao.baidu.com/question/1511266887807047660.html 指定弹出的子窗口为模态窗口就可以了,这样在子窗口没有关闭前,是不能操作父窗 ...

  4. P4013 数字梯形问题

    \(\color{#0066ff}{题目描述}\) 给定一个由 \(n\) 行数字组成的数字梯形如下图所示. 梯形的第一行有 \(m\) 个数字.从梯形的顶部的 \(m\) 个数字开始,在每个数字处可 ...

  5. [SHOI2002]百事世界杯之旅

    题目:"--在2002年6月之前购买的百事任何饮料的瓶盖上都会有一个百事球星的名字.只要凑齐所有百事球星的名字,就可参加百事世界杯之旅的抽奖活动,获得球星背包,随声听,更克赴日韩观看世界杯. ...

  6. HashMap 1.8的源码分析二

    hashmap的构造方法: public HashMap(int initialCapacity, float loadFactor) { ) throw new IllegalArgumentExc ...

  7. js-带操作的赋值表达式

    带操作的赋值表达式为: a op= b 这里op代表一个运算符,这个表达式等价于: a = a op b 这里需要特别注意:在第一个表达式中,表达式a计算了一次,而在第二个表达式中,表达式a计算了两次 ...

  8. lintcode - 房屋染色

    class Solution { public: /* * @param costs: n x 3 cost matrix * @return: An integer, the minimum cos ...

  9. Yii2的框架笔记整理

    1 .request的获取方式 $request = Yii::$app->request; 2. get参数的获取方式 $id = $request->get('id',1);获取get ...

  10. 1-----Scrapy框架整体的一个了解

    这里是通过爬取伯乐在线的全部文章为例子,让自己先对scrapy进行一个整理的理解 该例子中的详细代码会放到我的github地址:https://github.com/pythonsite/spider ...