hystrix线程池资源隔离的理解

hystrix作为一款熔断、降级、资源隔离的优秀组件,广泛流行。

hystrix如何进行隔离,有线程池隔离和信号量两种方式。

信号量隔离相对来说容易理解,他就是一个计数器,显示服务的请求数量,起到了限流的作用。

如何理解线程池隔离,我刚接触hystrix的时候就走向了误区。

hystrix线程池资源隔离的理解_第1张图片

这张图是我们在网上常常看到的,描述hystrix的原理的图。

但是,其实这张图并不严谨,会把我们带到一个误区。

看到这张图以及网上的讲解,我一开始认为,hystrix会在服务消费方,也就是调用者微服务中,将上游来的请求封装到一个单独的线程池中,跟tomcat其他的线程池隔离,本次请求量就算再大也只是会撑满自己的线程池,不会影响tomcat的其他服务。这样就保护了这个微服务的其他接口。卧槽,这得多流弊。

但是,实际上是我想多了,仔细想想也是,外部流量进来,首先接收流量的就是tomcat的threadpool,轮到hystrix干活,还要经过九曲十八弯呢。

那hystrix的线程池隔离是什么意思呢,实际上,是接口的请求在来到hystrix之前还要经过controller、service等,真正被hystrix接收到后,hystrix才会创建线程池,把请求放到新的线程中,请求下游的服务。这个过程中,hystrix就可以控制等待超时、失败请求统计等操作。所以这个线程池的大小就决定了对下游服务的并发请求量,实际上也是在这里起到了对下游服务的一个保护。重点就是对下游服务的保护。对自己所在的服务是否有保护呢,如果我们的hystrix超时时间(execution.isolation.thread.timeoutInMilliseconds)设置的非常长,那么当下游服务响应慢或无响应时,hystrix所在的服务也会长时间挂起,这样tomcat的线程池也就很快会耗尽,失去保护作用。所以我们的hystrix超时时间,失败统计次数,失败比例等参数设置的合理才能起到对自己的保护作用,也就是对下游响应慢或无响应的服务,能够快速熔断,进行降级,返回降级结果,释放宝贵的tomcat线程资源。

你可能感兴趣的:(java,微服务,hystrix)