​在微服务架构中,我们不可避免的与Hystrix打交道,最近在面试过程中,也总是被问到Hystrix两种熔断方式的区别,今天,就给大家做个小结。

首先,Hystrix熔断方式主要有两种:

  1. 线程池隔离

  2. 信号量隔离

我们知道,线程池其实相当于一个容器(池子),容器只有那么大,超过了其限定额度,就溢出啦,线程池有哪些参数,这里就不再给大家赘述了,有兴趣的朋友可以看看我之前发表的文章,有详细的解释。那么信号量隔离是什么呢?相信有朋友已经想到了,对,就是Semaphore。那么Semaphore是怎么使用的呢?刚好之前写了一段demo,给大家展示下

 public static void main(String[] args) {
Semaphore semaphore = new Semaphore(3); ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
final long num = i;
executorService.submit(new Runnable() {
@Override
public void run() {
try {
//获取许可
semaphore.acquire();
//执行
System.out.println("Accessing: " + num);
Thread.sleep(new Random().nextInt(5000)); // 模拟随机执行时长
//释放
semaphore.release();
System.out.println("Release..." + num);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
} executorService.shutdown(); }

  


可以看到,Semaphore其实也是限定大小,同时访问的线程会去争抢获取一个标识,相当于获取token秘钥,拿到的人才有机会执行该逻辑,同时,尤其记住执行完毕之后需要手动释放该标识。

下面,我们就来说说线程池和信号量隔离的区别:

  线程池 信号量
线程 请求线程和调用provider线程不是同一条线程 请求线程和调用provider线程是同一条线程
开销 排队、调度、上下文切换等 无线程切换,开销低
异步 支持 不支持
并发支持 支持:最大线程池大小 支持:最大信号量上限
传递Header 不支持 支持
支持超时 支持 不支持

那么,他们两又是各自在什么情况下使用呢?

    1. 线程池隔离

      请求并发量大,并且耗时长(一般是计算量大或者读数据库):采用线程池隔离,这样的话,可以保证大量的容器线程可用,不会由于服务原因,一直处于阻塞或者等待状态,快速失败返回。

    2. 信号量隔离

请求并发量大,并且耗时短(一般是计算量小,或读缓存):采用信号量隔离:因为这类服务的返回往往非常快,不会占用容器线程太长时间,并且减少了线程切换的一些开销,提高了缓存服务的效率

Hystrix两种隔离方式对比的更多相关文章

  1. spring-data-mongodb两种实现方式对比

    spring-data-mongodb两种实现方式对比 参考链接:https://blog.csdn.net/feinifi/article/details/83752862

  2. hystrix两种隔离模式分析

    hystrix隔离模式目前有两种方式:信号量模式和线程池模式. 但信号量并不支持超时,当被调服务发生问题时,有少部分用户会长时间无法得到响应. 另外,使用线程池模式无法传递Header,我估计是由于线 ...

  3. 单例模式的两种实现方式对比:DCL (double check idiom)双重检查 和 lazy initialization holder class(静态内部类)

    首先这两种方式都是延迟初始化机制,就是当要用到的时候再去初始化. 但是Effective Java书中说过:除非绝对必要,否则就不要这么做. 1. DCL (double checked lockin ...

  4. Java中常用到的文件操作那些事(二)——使用POI解析Excel的两种常用方式对比

    最近生产环境有个老项目一直内存报警,不时的还出现内存泄漏,导致需要重启服务器,已经严重影响正常服务了.获取生成dump文件后,使用MAT工具进行分析,发现是其中有个Excel文件上传功能时,经常会导致 ...

  5. Hystrix-基本概念(设计原则和两种隔离技术)

    一.Hystrix是什么在微服务的架构系统中,每个服务都可能会调用很多其他服务,被调用的那些服务就是依赖服务.有的时候某些依赖服务出现故障也是很正常的.Hystrix可以让我们在对服务间的调用进行控制 ...

  6. Java多线程13:读写锁和两种同步方式的对比

    读写锁ReentrantReadWriteLock概述 大型网站中很重要的一块内容就是数据的读写,ReentrantLock虽然具有完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务 ...

  7. Windows校验文件哈希hash的两种常用方式

    大家经常都到哪儿去下载软件和应用程序呢?有没想过下载回来的软件.应用程序或资源是否安全呢?在 Windows 10 和 Office 2016 发布当初,很多没权限的朋友都使用第三方网站去下载安装映像 ...

  8. 动态代理的两种实现方式(JDK/Cglib)

    =========================================== 原文链接: 动态代理的两种实现方式(JDK/Cglib) 转载请注明出处! ================== ...

  9. mongodb 系列 ~ mongo的两种引擎介绍对比

    一 简介 两种引擎方式的对比二  对比与说明   1 版本支持      MMAP引擎 3.2版本之前,默认引擎       WT 引擎 3.2版本之后,默认引擎   2 并发性能(核心)     M ...

  10. Nginx 和 PHP 的两种部署方式比较

    2种部署方式简介 第一种 前置1台nginx服务器做HTTP反向代理和负载均衡 后面多态服务器部署Nginx Web服务和php-fpm提供的fast cgi服务 第二种 前置1台nginx服务器做W ...

随机推荐

  1. 基于FATE的可验证秘密分享算法详解及应用场景分享:学习

    内容来自"光大科技-基于FATE的可验证秘密分享算法详解及应用场景分享" 理论 基于Shamir的秘密共享方案,通过多项式插值实现. 加入可验证功能,即发送多项式系数的模数给对方作 ...

  2. 在SOUI4中使用非客户区自绘

    前段时间用sdl嵌入SOUI做视频播放器,由于SOUI习惯屏蔽系统默认的非客户区,而在窗口自己的客户区分出一块来模拟非客户区,导致窗口在拉伸的时候,SOUI窗口会出现比较严重的闪烁(不光是SOUI这样 ...

  3. redis渐进式rehash

    本文分享自天翼云开发者社区<redis渐进式rehash>,作者:l****n Redis是k-v型数据库,其内部设计了一种dict类型的数据结构用来存储键值结构. dict 通常的存储结 ...

  4. 修改NuGet包默认存放位置

    默认情况下,NuGet下载的包存放在系统盘(C盘中),这样一来,时间长了下载的包越多,C盘占用的空间也就越多. 1.问题描述 默认情况下,NuGet下载的包存放在系统盘(C盘中,一般在路径C:\Use ...

  5. [业界方案] Yarn的业界解决方案和未来方向

    [业界方案] Yarn的业界解决方案和未来方向 目录 [业界方案] Yarn的业界解决方案和未来方向 0x00 摘要 0x01 Yarn 1.1 参考文章 0x02 分析 2.1 综述 2.1.1 y ...

  6. 什么是token?token是用来干嘛的?

    从事计算机行业的朋友都听说过token这么个东西,尤其是deepseek爆火后api(大家都知道什么意思吧),但是其他行业的人就很少了解到token,下面就给大家来详细介绍一下token是什么意思?t ...

  7. hibernate的锁机制

    概述 hibernate 可以通过加锁解决并发问题. hibernate 的锁分为两种:乐观锁和悲观锁. 乐观锁(Optimistic lock):每次访问数据时,都会乐观的认为其它事务此时肯定不会同 ...

  8. js 字符串“http%3A%2F%2F”转换成http://详解

    字符串"http%3A%2F%2F"转换成http://详解 我截获下来一个URL的字符串格式是"http%3A%2F%2F",但是实际应该是http:// 而 ...

  9. C51基础知识总览

  10. 特征转换之python代码

    一.连续型变量1.1 连续变量无量纲化(1)无量纲化: 使不同规格尺度的数据转化统一规格尺度(将数据单位统一)(2)无量纲化方法:标准化, 区间所方法 标准化: 将连续性变量转变为 均值0 标准差1 ...