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

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. Django博客开发教程,Django快速开发个人blog

    学DjangoWEB框架,估计大部分的朋友都是从Blog开发开始入门的,Django中文网发布了一个Django开发教程,这个教程简单易懂,能让你快速的使用Django开发一个漂亮的个人blog,是D ...

  2. DB2存储过程标准

    CREATE OR REPLACE PROCEDURE "FCT"."PROC_FCT_DSB_SERIES"(IN ACCOUNTING_DATE DATE) ...

  3. Orcale创建函数(function)

    Oraclec创建函数的语法规则 create or replace function  函数名 (参数名1 参数类型,参数名2 参数类型)  return number  is Result num ...

  4. NOIP2018初赛总结(提高组)(试题+答案+简要解析)

    NOIP2018初赛总结(提高组) 更新完毕(纯手敲),如果有错误请在下面留言 单选题 T1.下列四个不同进制的数中,与其它三项数值上不相等的是 A.\((269)_{16}\) B.\((617)_ ...

  5. CF671A Recycling Bottles 计算几何

    It was recycling day in Kekoland. To celebrate it Adil and Bera went to Central Perk where they can ...

  6. CF580C Kefa and Park dfs

    Kefa decided to celebrate his first big salary by going to the restaurant. He lives by an unusual pa ...

  7. 统计元音(stringstream的-应用)

    Problem Description 统计每个元音字母在字符串中出现的次数.   Input 输入数据首先包括一个整数n,表示测试实例的个数,然后是n行长度不超过100的字符串.   Output ...

  8. windows安装redis并设置别名

    最近两天不知什么原因导致win10的redis 无法通过 双击 redis-server.exe 文件启动 redis服务:于是从新安装并且 通过命令行启动服务,并且设置别名,每次方便启动服务 1.下 ...

  9. linux 环境下tomcat中部署jfinal项目

    tomcat中部署jfinal项目 问题现象如下图 问题描述: 我在自己的windows7系统上tomcat下面跑这个项目没有任何问题吗,但是当我把项目上传到linux服务器上的tomcatwebap ...

  10. win7 宽带连接 711错误

    新装Win7系统,建立宽带连接后提示711错误,网上转一圈,方法不少,对症下药,不是很管用 以下是我总结的方法 win7 旗舰版 administration 用户 设置以下几个服务为手动或自动,并启 ...