hystrix使用舱壁隔离模式来隔离和限制各个请求,设计了两种隔离方式:信号量和线程池。线程池隔离:对每个command创建一个自己的线程池,执行调用。通过线程池隔离来保证不同调用不会相互干扰和每一个调用的并发限制。信号量隔热:对每个command创建一个自己的计数器,当并发量超过计数器指定值时,直接拒绝。使用信号量和线程池的一个区别是,信号量没有timeout机制。

  线程池隔离的本质是,如果在线程池执行模式下,调用响应的线程池,如果执行数量超过指定限制,线程池就会抛出异常。

  1. if (properties.executionIsolationStrategy().get() == ExecutionIsolationStrategy.THREAD) {
  2. return Observable.defer(new Func0<Observable<R>>() {
  3. @Override
  4. public Observable<R> call() {
  5. ...
  6. try {
  7. ...
  8. executionHook.onExecutionStart(_cmd);
  9. return getUserExecutionObservable(_cmd);
  10. } catch (Throwable ex) {
  11. return Observable.error(ex);
  12. }
  13. ...
  14. }
  15. }).subscribeOn(threadPool.getScheduler(new Func0<Boolean>() {
  16. @Override
  17. public Boolean call() {
  18. return properties.executionIsolationThreadInterruptOnTimeout().get() && _cmd.isCommandTimedOut.get() == TimedOutStatus.TIMED_OUT;
  19. }
  20. }));
  21. }

  信号量隔离的本质是,针对每一个command使用一个原子变量,定义当前其执行并发量,如果在SEMAPHORE执行时,会尝试获取这个原子变量,如果超过了限制执行fallback降级流程。

  1. private Observable<R> applyHystrixSemantics(final AbstractCommand<R> _cmd) {
  2. ...
        final TryableSemaphore executionSemaphore = getExecutionSemaphore();
  3. if (executionSemaphore.tryAcquire()) {
  4. try {
  5. ...
  6. return executeCommandAndObserve(_cmd)
  7. .doOnError(markExceptionThrown)
  8. .doOnTerminate(singleSemaphoreRelease)
  9. .doOnUnsubscribe(singleSemaphoreRelease);
  10. } catch (RuntimeException e) {
  11. return Observable.error(e);
  12. }
  13. } else {
  14. return handleSemaphoreRejectionViaFallback();
  15. }
  16. ...
  17. }
  1. protected TryableSemaphore getExecutionSemaphore() {
  2. if (properties.executionIsolationStrategy().get() == ExecutionIsolationStrategy.SEMAPHORE) {
  3. if (executionSemaphoreOverride == null) {
  4. TryableSemaphore _s = executionSemaphorePerCircuit.get(commandKey.name());
  5. if (_s == null) {
  6. // we didn't find one cache so setup
  7. executionSemaphorePerCircuit.putIfAbsent(commandKey.name(), new TryableSemaphoreActual(properties.executionIsolationSemaphoreMaxConcurrentRequests()));
  8. // assign whatever got set (this or another thread)
  9. return executionSemaphorePerCircuit.get(commandKey.name());
  10. } else {
  11. return _s;
  12. }
  13. } else {
  14. return executionSemaphoreOverride;
  15. }
  16. } else {
  17. return TryableSemaphoreNoOp.DEFAULT;
  18. }
  19. }

  TryableSemaphoreActual封装了一个原子

  1. static class TryableSemaphoreActual implements TryableSemaphore {
  2. protected final HystrixProperty<Integer> numberOfPermits;
  3. private final AtomicInteger count = new AtomicInteger(0);
  4.  
  5. public TryableSemaphoreActual(HystrixProperty<Integer> numberOfPermits) {
  6. this.numberOfPermits = numberOfPermits;
  7. }
  8.  
  9. @Override
  10. public boolean tryAcquire() {
  11. int currentCount = count.incrementAndGet();
  12. if (currentCount > numberOfPermits.get()) {
  13. count.decrementAndGet();
  14. return false;
  15. } else {
  16. return true;
  17. }
  18. }
  19.  
  20. @Override
  21. public void release() {
  22. count.decrementAndGet();
  23. }
  24.  
  25. @Override
  26. public int getNumberOfPermitsUsed() {
  27. return count.get();
  28. }
  29.  
  30. }

hystrix总结之限流的更多相关文章

  1. springcloud(六) Hystrix 熔断,限流

    Hystrix 熔断: 首先仍然启动Eureka,这里就不说了. OrderController.java: package com.tuling.cloud.study.user.controlle ...

  2. 微服务容错限流Hystrix入门

    为什么需要容错限流 复杂分布式系统通常有很多依赖,如果一个应用不能对来自依赖 故障进行隔离,那么应用本身就处在被拖垮的风险中.在一个高流量的网站中,某个单一后端一旦发生延迟,将会在数秒内导致 所有应用 ...

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

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

  4. 服务熔断、降级、限流、异步RPC -- HyStrix

    背景 伴随着业务复杂性的提高,系统的不断拆分,一个面向用户端的API,其内部的RPC调用层层嵌套,调用链条可能会非常长.这会造成以下几个问题: API接口可用性降低 引用Hystrix官方的一个例子, ...

  5. 微服务熔断限流Hystrix之流聚合

    简介 上一篇介绍了 Hystrix Dashboard 监控单体应用的例子,在生产环境中,监控的应用往往是一个集群,我们需要将每个实例的监控信息聚合起来分析,这就用到了 Turbine 工具.Turb ...

  6. springcloud组件之hystrix服务熔断,降级,限流

    hystrix 简介 Hystrix是什么 在分布式环境中,许多服务依赖项中的一些必然会失败.Hystrix是一个库,通过添加延迟容忍和容错逻辑,帮助你控制这些分布式服务之间的交互.Hystrix通过 ...

  7. 微服务组件--限流框架Spring Cloud Hystrix分析

    Hystrix的介绍 [1]Hystrix是springCloud的组件之一,Hystrix 可以让我们在分布式系统中对服务间的调用进行控制加入一些调用延迟或者依赖故障的容错机制. [2]Hystri ...

  8. Spring Cloud Zuul 限流详解(附源码)(转)

    在高并发的应用中,限流往往是一个绕不开的话题.本文详细探讨在Spring Cloud中如何实现限流. 在 Zuul 上实现限流是个不错的选择,只需要编写一个过滤器就可以了,关键在于如何实现限流的算法. ...

  9. Spring Cloud实践:降级、限流、滚动、灰度、AB、金丝雀的实现思路

    端口:8888,方便起见直接读取配置文件,生产环境可以读取git.application-dev.properties为全局配置.先启动配置中心,所有服务的配置(包括注册中心的地址)均从配置中心读取. ...

随机推荐

  1. idea提升效率的插件

    这篇文章用于记录idea插件.多分类记录确实可以提升效率. 1. FindBugs 虽说Idea本身提供的代码检查工具已经很强大了,但Idea提供的更多是规范性的检查,如果需要深入地检查异常,可以使用 ...

  2. JavaScript学习系列博客_17_JavaScript中的函数的参数、返回值

    数的形参(形式参数) - 定义函数时,可以在()中定义一个或多个形参,形参之间使用英文逗号隔开:定义形参就相当于在函数内声明了对应的变量但是并不赋值,形参会在调用时才赋值. 函数的实参(实际参数) - ...

  3. Mybatis_day1

    mybatis框架的引入: JDBC里面 对功能实现的进一步封装,可以按照以下方式操作 Student s = new Student(id,name); util.save(s); ORM: obj ...

  4. 浅谈AutoML

    Auto ML的概念很广很深,本篇文章旨在概念上的一些理解.   我们之前谈过一个模型从幕后走向台前是有很多的工作要做的,AutoML的最初目标正如其名字是想自动化这个过程.实际上有很多人讨论到Aut ...

  5. neutron-server Connection pool is full, discarding connection 连接池过满

    参考链接:https://zhiliao.h3c.com/Theme/details/48291 问题: -- ::33.235 WARNING requests.packages.urllib3.c ...

  6. 计算机网络-传输层(1)UDP协议

    UDP协议基于Internet IP协议,只提供两个基础功能: 分用/复用 分用:主机接收到IP数据报(datagram),每个数据报携带源IP地址.目的IP地址且携带一个传输层的段(Segment) ...

  7. 如何处理遇到的错误-lammps

    一.认清模型——data文件: 二.读懂in文件: 三.当遇到error时,we can do: 1.查错: (1)从out文件中,复制里边的错误信息(copy一部分,不用全部): (2)进入到lam ...

  8. 基于postman的api自动化测试实践

    测试的好处 每个人都同意测试很重要,但并不是所有人都会去做.每当你添加新的代码,测试可以保证你的api按照预期运行.通过postman,你可以为所有api编写和运行测试脚本. postman中的测试 ...

  9. Git深入浅出使用教程:Git安装、远程控制、常用命令(全)

    一.软件安装 1.先安装[Git-2.24.1.2-64-bit.exe]软件.(官网下载的很慢,可以在百度云盘下载我的) 链接:https://pan.baidu.com/s/1uoIS9DWSBp ...

  10. 微信小程序授权登录--PHP后端接口

    由于之前做过公众号的一个开发,所以再开发小程序就没有那么多坑了,在这也记录一下开发过程,以方便后续进行参考. 废话不多说,直接上官方文档,任何使用第三方开发的,不看文档就是耍流氓.小程序开发文档,可以 ...