1.在腾讯课堂看到服务雪崩,就是一个服务访问太多,导致服务之间的相应超时,一直堆积,导致其他访问也一直等待,访问不了。
2.解决方案:
1)超时机制
2)断路器
Hystrix,当你访问数量超过一定时,进行报错
它具体是如何做到的呢?
Hystrix有两种形式进行熔断策略的:线程池,信号量
线程池,将请求的线程交给线程池,靠线程池的拒绝策略来控制
信号量模式,Semaphone,信号量每次减一,当执行完,将信号量释放
那么它们之间有什么区别?
隔离方式 | 是否支持超时 | 是否支持熔断 | 隔离原理 | 是否是异步调用 | 资源消耗 |
线程池隔离 | 支持,可直接返回 | 支持,当线程池到达maxSize后,再请求会触发fallback接口进行熔断 | 每个服务单独用线程池 | 可以是异步,也可以是同步。看调用的方法 | 大,大量线程的上下文切换,容易造成机器负载高 |
信号量隔离 | 不支持,如果阻塞,只能通过调用协议(如:socket超时才能返回) | 支持,当信号量达到maxConcurrentRequests后。再请求会触发fallback | 通过信号量的计数器 | 同步调用,不支持异步 |
小,只是个计数器 |
上图参考其他博客。
可以看到线程池支持超时处理,同时它资源消耗也是巨大的。