Hystrix 服务的隔离策略对比,信号量与线程池隔离的差异

Stella981
• 阅读 1043

hytrix支持线程池隔离和信号量隔离

  • 信号量隔离适应非网络请求,因为是同步的请求,无法支持超时,只能依靠协议本身
  • 线程池隔离,即,每个实例都增加个线程池进行隔离

先给个总结对比:

隔离方式

是否支持超时

是否支持熔断

隔离原理

是否是异步调用

资源消耗

线程池隔离

支持,可直接返回

支持,当线程池到达maxSize后,再请求会触发fallback接口进行熔断

每个服务单独用线程池

可以是异步,也可以是同步。看调用的方法

大,大量线程的上下文切换,容易造成机器负载高

信号量隔离

不支持,如果阻塞,只能通过调用协议(如:socket超时才能返回)

支持,当信号量达到maxConcurrentRequests后。再请求会触发fallback

通过信号量的计数器

同步调用,不支持异步

小,只是个计数器

看官网的定义引用理解

信号量的隔离:

  •  it executes on the calling thread and concurrent requests are limited by the semaphore count

 - 引自官网

自我理解:

每次调用线程,当前请求通过计数信号量进行限制,当信号大于了最大请求数(maxConcurrentRequests)时,进行限制,调用fallback接口快速返回。

Hystrix 服务的隔离策略对比,信号量与线程池隔离的差异

最重要的是,信号量的调用是同步的,也就是说,每次调用都得阻塞调用方的线程,直到结果返回。这样就导致了无法对访问做超时(只能依靠调用协议超时,无法主动释放)

官网对信号量隔离的描述建议

  • Generally the only time you should use semaphore isolation for HystrixCommands is when the call is so high volume (hundreds per second, per instance) that the overhead of separate threads is too high; this typically only applies to non-network calls.

 理解下两点:

  1. 隔离的细粒度太高,数百个实例需要隔离,此时用线程池做隔离开销过大
  2. 通常这种都是非网络调用的情况下

线程池隔离:

  • it executes on a separate thread and concurrent requests are limited by the number of threads in the thread-pool

通过每次都开启一个单独线程运行。它的隔离是通过线程池,即每个隔离粒度都是个线程池,互相不干扰

  • Commands executed in threads have an extra layer of protection against latencies beyond what network timeouts can offer.

线程池隔离方式,等于多了一层的保护措施,可以通过hytrix直接设置超时,超时后直接返回。

Hystrix 服务的隔离策略对比,信号量与线程池隔离的差异

分享个以前的一个误解

以前对zuul网关的一个误解,以为网关用的是线程池隔离是属于异步调用的,以为只要用了线程池隔离,不需要去考虑本身具体的线程池大小了。

具体看源码:

Hystrix 服务的隔离策略对比,信号量与线程池隔离的差异 Hystrix 服务的隔离策略对比,信号量与线程池隔离的差异

调用的是hytrix command的excute方法,hytrix的官网原文说明如下:

  • execute() — blocks, then returns the single response received from the dependency (or throws an exception in case of an error)

execute是一个阻塞方法,也就是说,如果不合理的设置线程池的大小,和超时时间,还是有可能把zuul的线程消耗完。从而失去对服务的保护作用

公众号:

Hystrix 服务的隔离策略对比,信号量与线程池隔离的差异

何锦彬 2018.09.21

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
OMG!Java高级开发岗必问知识点
目录1.Mysql2.CHAR与VARCHAR的区别?3.能说下myisam和innodb的区别吗?4.你能说下事务的基本特性和隔离级别吗?5.并发问题脏读、不可重复读、幻读?6.事务的隔离级别?7.说说自增主键、UUID?8.mysql的约束分类?9.drop、delete与tru
Stella981 Stella981
3年前
Flask 的 数据库连接 与 DBUtils 数据库连接池
Flask的数据库连接与DBUtils数据库连接池本地线程:thread_local为每个线程创建存储数据的空间,用于线程之间的数据隔离否则多个线程同时访问,会使得数据混乱<br<
Easter79 Easter79
3年前
SpringCloud从入门到进阶——单点部署Zuul的压力测试与调优(一)
前言说明:通过zuul访问后端服务时,这个流程是如何的?当你用500线程并发访问zuul和用100线程并发访问zuul,zuul分别会用多少个线程去并发访问后端的服务?后端最多能承受多少个并发线程?zuul默认是Hystrix的信号量隔离,这个值对zuul并发访问后端时有什么影响?可以通过这一篇来了解一下。内容  作为微服务架构系统的入口,毫无疑
Stella981 Stella981
3年前
Hystrix实现ThreadLocal上下文的传递 转
springcloud微服务中,服务间传输全局类参数,如session信息等。一、问题背景Hystrix有2个隔离策略:THREAD以及SEMAPHORE,当隔离策略为THREAD时,是没办法拿到ThreadLocal中的值的。Hystrix提供了基于信号量和线程两种隔离模式,通过在Hystrix基础章节中已经验证过,通过
Easter79 Easter79
3年前
SpringCloud之Hystrix服务降级(七)
Hystrix设计原则1.防止单个服务的故障,耗尽整个系统服务的容器(比如tomcat)的线程资源,避免分布式环境里大量级联失败。通过第三方客户端访问(通常是通过网络)依赖服务出现失败、拒绝、超时或短路时执行回退逻辑2.用快速失败代替排队(每个依赖服务维护一个小的线程池或信号量,当线程池满或信号量满,会立即拒绝服务而不会排队等待)和优雅的服
Stella981 Stella981
3年前
Noark入门之线程模型
0x00单线程多进程单线程与单进程多线程的目的都是想尽可能的利用CPU,减少CPU的空闲时间,特别是多核环境,今天咱不做深度解读,跳过...0x01线程池锁最早的一部分游戏服务器是采用线程池的方式来处理玩家的业务请求,以达最大限度的利用多核优势来提高处理业务能力。但线程池同时也带来了并发问题,为了解决同一玩家多个业务请求不被
Easter79 Easter79
3年前
ThreadLocal理解
1.使用ThreadLocal的时候我们保证了每个线程可以隔离使用对象,避免线程间的数据干扰。常用例子:publicclassThreadLocalTest{publicstaticvoidmain(Stringargs)throwsInterruptedException{