zoukankan      html  css  js  c++  java
  • Hystrix两种隔离方式对比

    ​在微服务架构中,我们不可避免的与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. 信号量隔离

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

  • 相关阅读:
    初学Cocos2dx
    炸弹人NABCD分析
    求二维整数数组中最大联通子数组的和
    大道之简读书笔记1
    求首位相连二维数组最大子矩阵的和
    求首位相连一维数组最大子数组的和
    求二维数组最大子数组的和
    程序员修炼之道读后感3
    电梯调度需求分析
    课堂作业第四周课上作业二
  • 原文地址:https://www.cnblogs.com/pretttyboy/p/13519823.html
Copyright © 2011-2022 走看看