雪崩问题
:::tips
微服务中,服务间调用关系错综复杂,一个微服务往往依赖于多个其它微服务。如果某个服务提供者发生了故障,部分依赖于这个服务的其他微服务,请求会被阻塞,用户不会得到响应,则在tomcat中这个线程不会释放,于是越来越多的请求到来,越来越多的线程会被阻塞,服务器支持的线程和并发数有限,请求一直阻塞,会导致服务器资源耗尽,从而导致所有其它服务都不可用,那么当前服务也会不可用。那么随着时间的推移,最终大量服务都会变得不可用,形成级联失败的问题,雪崩就发生了
总结
雪崩问题:
- 微服务之间相互调用,因为调用链中的一个服务故障,导致整个链路都无法访问
解决方案:
- 限流是对服务的保护,避免因瞬间高并发流量而导致服务故障,进而避免雪崩,是一种预防措施
超时处理、线程隔离、降级熔断是在部分服务故障时,将故障控制在一定范围,避免出现雪崩问题,是一种补救措施 :::
解决方案
:::tips 解决雪崩问题的常见方式有四种:
超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止地等待
- 舱壁模式(线程隔离):舱壁模式来源于船舱的设计,船舱被隔板分离为多个独立空间,当船体破损时,只会导致部分空间进水,将故障控制在一定范围内,避免整个船体都被淹没。于此类似,我们可以限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离
- 熔断降级(断路器):由断路器统计业务执行的异常比例,如果超出阈值则会熔断该业务,拦截访问该业务的一切请求
- 流量控制(限流):限制业务访问的QPS(每秒处理请求的多少),避免服务因流量的突增而故障 :::