线程池隔离
一个服务有多个接口,在提供服务时,使用了线程池,多个接口共用这一个线程池,如下图所示:
那么当某个接口处理效率缓慢,当对该接口的请求量上升时,由于该接口处理效率慢,对于该接口的请求就会占用公用的连接池,并且如果长时间没有释放连接,就会造成其他接口没有线程池来处理请求,于是就会出现因为一个接口的问题,导致整个服务的多个接口都不可用。
为了解决这种问题,Hystrix提供了线程池隔离,可以为每个接口设置单独的线程池,当该接口的线程池被占满时,只是该接口收到影响,而不会对其他接口造成影响,如下图所示:
另外,可以让一部分service共用线程池的同时,另一部分service做线程池隔离,如下图:
信号量隔离
信号量隔离的方式,和线程池隔离的方式相似,如下图所示:
信号量隔离的原理:会设置一个信号量值(计数器),当一个接收到一个请求后,信号量减1;当请求处理完后,信号量加1;当信号量减为0的时候,表示不能再接受请求,则会拒绝处理。
线程隔离与信号量隔离的区别
线程池隔离
优点:
1.可以设置coreSize和MaxQueueSize,也就是说,支持排队;
2.可以设置调用超时时间;
3.支持异步调用;
缺点:
1.创建线程池会产生额外的开销,且开销比信号量大;
适用场景:
1.调用其他服务(不受信的服务,不能保证其他服务的服务质量);
2.适合调用的服务比较少的情况(扇出少),如果比较多,则线程池也要加大;
信号量隔离
优点:
1.轻量,开销可以忽略不计;
缺点:
1.不支持任务排队,只要信号量减为0,立即就会被拒绝;
2.不支持设置超时,在执行过程中,只能等待调用拿到结果或者抛出异常,操作才会继续;
3.不支持异步调用;
适用场景:
1.网关(扇出多);
2.受信服务(被调用服务能够保证不超时);
3.高频高速调用(比如查cache这种操作,基本能保证在很多时间内响应)