image.png

隔离策略

Hystrix 使用线程池隔离,假设现在有 100 个人要访问 hello 请求,Hystrix 默认会为 hello 请求做一个线程池,假设这个线程池只有 50 的容量,那每有 1 个请求进来,线程池都会为其分配一个线程,这样整个线程池的最大容量就是 50 个请求,如果再有多的请求,Hystrix 就会直接退回

这样做的缺点就是,如果再有一个 haha 请求,再有一个 enen 请求,这 3 请求,我们都想保护,这样 Hystrix 就会创建 3 个线程池,这样整个系统的线程池就会很多,线程池多了之后,线程之间的切换就会很浪费时间,所以这是对性能的极大影响,线程池可能用着用着就不够了,导致服务宕机

Sentinel则使用信号量隔离,它会为 hello、haha、enen 请求都设置一个信号量,假设都是50,请求一进来之后,访问的 hello 请求,如果 hello 的信号量为 0 了,那就直接退回这个请求,而 hello 里面的请求则是每有 1 个执行完了,就会让信号量 + 1,这样新的请求又能进来了

当然线程池隔离也有一个很大的优点,就是隔离的非常彻底,每一个请求都有自己的线程池,就算是自己的线程池出问题,也不会影响其他请求,而信号量隔离,一旦有一个请求的信号量出问题了,那肯定会影响其他请求。

熔断降级策略

基于响应时间:假设每个请求的访问频率超过1秒,就可以熔断

基于异常比率:假设100次请求,有90次以上都出异常,异常比率超过90%,也可以熔断

基于异常数:假设100次请求,有5个出现异常,也可以熔断

系统自适应保护

  • Sentinel在得知系统性能之后,可以在低峰期将流量都放进来,高峰期对流量进行限制