先说一下信号量和线程池的概念
信号量:Semaphore 是一个并发工具类,用来控制同时并发的线程数量,每次线程执行的时候,都需要通过acquire获得许可,线程执行完毕后,通过release方法释放。
线程池:线程池规定的线程数量,每个线程都是可复用的,其他线程是否可以加入需要看线程池满不满,不需要我们自己手动控制
信号量和线程池的区别
信号量只是规定的线程数量,这些线程都是需要我们手动new出来的,并不参与线程执行的具体逻辑,只不过其他线程想要同时处理请求时,需要查看信号量是否有空余的位置
线程池中的线程是线程池自己创建的,并且进行维护,我们在开发的过程中只需要关注具体的逻辑实现,不需要关注线程的创建及释放
隔离的概念及为什么需要隔离
先说一下不隔离的场景,client 发起一个请求,一个请求对应一个线程,这个线程在调用其他服务时,直接通过http请求去获取资源,假设服务响应失败,那么这个请求就会直接抛出异常。
加了隔离之后,我在请求的基础上,再维护一个线程池,这个线程池就用来负责其他微服务的请求与调用,如果服务请求响应失败,也不影响我第一个线程的执行,并且我还可以增加对应的响应策略,根据响应策略来做具体的降级、熔断,并且可以通过信号量和线程池来规定具体的请求次数,来达到限流的目的
信号量隔离与线程隔离的区别
理解上面的概念之后,我们就可以来讨论上面这个概念了
线程池隔离是通过hystrix自己的线程去实现的,在调用服务的同时,再new出来一个线程池
信号量隔离则是tomcat线程去调用服务的,我无条件的相信服务提供者代码的健壮性及时效性,不会出任何问题,相对于线程池来说,更加的轻量级