线程池隔离

一个服务有多个接口,在提供服务时,使用了线程池,多个接口共用这一个线程池,如下图所示:

那么当某个接口处理效率缓慢,当对该接口的请求量上升时,由于该接口处理效率慢,对于该接口的请求就会占用公用的连接池,并且如果长时间没有释放连接,就会造成其他接口没有线程池来处理请求,于是就会出现因为一个接口的问题,导致整个服务的多个接口都不可用。

为了解决这种问题,Hystrix提供了线程池隔离,可以为每个接口设置单独的线程池,当该接口的线程池被占满时,只是该接口收到影响,而不会对其他接口造成影响,如下图所示:

另外,可以让一部分service共用线程池的同时,另一部分service做线程池隔离,如下图:

信号量隔离

信号量隔离的方式,和线程池隔离的方式相似,如下图所示:

信号量隔离的原理:会设置一个信号量值(计数器),当一个接收到一个请求后,信号量减1;当请求处理完后,信号量加1;当信号量减为0的时候,表示不能再接受请求,则会拒绝处理。

线程隔离与信号量隔离的区别

线程池隔离

优点:

1.可以设置coreSize和MaxQueueSize,也就是说,支持排队;

2.可以设置调用超时时间;

3.支持异步调用;

缺点:

1.创建线程池会产生额外的开销,且开销比信号量大;

适用场景:

1.调用其他服务(不受信的服务,不能保证其他服务的服务质量);

2.适合调用的服务比较少的情况(扇出少),如果比较多,则线程池也要加大;

信号量隔离

优点:

1.轻量,开销可以忽略不计;

缺点:

1.不支持任务排队,只要信号量减为0,立即就会被拒绝;

2.不支持设置超时,在执行过程中,只能等待调用拿到结果或者抛出异常,操作才会继续;

3.不支持异步调用;

适用场景:

1.网关(扇出多);

2.受信服务(被调用服务能够保证不超时);

3.高频高速调用(比如查cache这种操作,基本能保证在很多时间内响应)