文章目录

  • 微服务框架
  • 微服务面试篇
  • 54 微服务篇
  • 54.7 Sentinel的线程隔离与Hystix的线程隔离有什么差别?
  • 54.7.1 Sentinel与Hystix的线程隔离有什么差别?


54 微服务篇

54.7 Sentinel的线程隔离与Hystix的线程隔离有什么差别?
54.7.1 Sentinel与Hystix的线程隔离有什么差别?

线程隔离有两种方式实现:

  • 线程池隔离(Hystix默认采用)
  • 信号量隔离(Sentinel默认采用)

【线程池隔离】

设置springcloud的线程池 springcloud线程池隔离_spring cloud

如果说现在 服务I 依赖于其他 服务,比如A、B

设置springcloud的线程池 springcloud线程池隔离_spring cloud_02

当用户请求来到 后,我们 会给它所依赖 的每个服务 都创建一个独立的线程池

这个请求要去调用 服务A 时,就必须去 服务A 线程池中 获取一个线程 来执行这个任务

设置springcloud的线程池 springcloud线程池隔离_spring cloud_03

即拿到 线程之后,再去通过Feign 的客户端 实现远程调用

如果现在池子里 的线程被取完了 ,再有新的请求,就没有可用 的线程 了,就相当于 限制了对服务A 的远程调用

即对A 的远程调用 只能并发的有 10 个【作用:限流、隔离】,同理 B 为5个

如果现在 服务A 出现了故障,那么请求在 访问服务A 的时候就 最多阻塞 10 个请求。现在对于服务I 自己而言,如果它自己的Tomcat 里面 有 500 个线程。即服务A 挂掉后,只会 占 10个,就不会把服务I 的资源给耗尽,这也是隔离的体现。

这种方式的弊端就是 会频繁地去 “创建线程”

【信号量隔离】

这种方式没有线程池,其实就是维护了 一个计数器,

设置springcloud的线程池 springcloud线程池隔离_微服务_04

虽然说 来就访问,但是会进行计数【计数器 有上限】操作,当计数器 到 0,说明就没有可用的 信号量了,之后再有 新的请求,就拒绝了,不让访问 了