Hystrix资源隔离

线程池隔离

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

   

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

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

   

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

   

 

信号量隔离

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

  

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

 

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

线程池隔离

  优点:

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

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

    3.支持异步调用;

  缺点:

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

  适用场景:

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

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

信号量隔离

  优点:

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

  缺点:

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

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

    3.不支持异步调用;

  适用场景:

    1.网关(扇出多);

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

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

posted @ 2020-06-29 13:17  寻觅beyond  阅读(842)  评论(0编辑  收藏  举报
返回顶部