文章目录
- 一、什么是服务的雪崩
- 二、服务雪崩形成的原因
- 三、雪崩解决方案
- 3.1 设置超时时间
- 3.2 线程隔离(舱壁模式)
- 3.3 熔断器(断路器)
- 3.4 限流
- 四、总结
一、什么是服务的雪崩
服务的雪崩效应是一种因服务提供者不可用导致服务调用者不可用,并将不可用逐渐放大的过程。
二、服务雪崩形成的原因
1.服务提供者不可用
2.重试加大流量
- 在服务提供者不可用后,用户由于忍受不了界面上的长时间等待,而不断刷新页面,甚至提交表单。
- 服务的调用端存在大量服务异常后的重试逻辑。
3.服务调用者不可用(服务雪崩效应的每个阶段都可能由不同的原因造成)造成服务不可能的原因如下:
- 硬件故障可能为硬件损坏造成的服务器主机死机,网络硬件故障造成的服务提供者的不可访问。
- 缓存击穿一般发生在缓存应用重启,所有缓存被清空时,以及短时间内大量的缓存失效时。大量的缓存不命中,使请求直接访问后端,造成服务提供者超负荷运行,引起服务不可用。
- 在秒杀和大促开始前,如果准备不充分,使用户发起大量的请求,也会造成服务的不可用。
服务调用者不可用的主要原因是当服务调用者使用同步调用时,会产大量的线程等待占用系统资源。一旦线程资源被耗尽,服务调用者提供的服务也将处于不可用状态,于是服务雪崩效应就产生了。
三、雪崩解决方案
3.1 设置超时时间
超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待。
3.2 线程隔离(舱壁模式)
舱壁模式来源于船舱的设计:
船舱都会被隔板分离为多个独立空间,当船体破损时,只会导致部分空间进入,将故障控制在一定范围内,避免整个船体都被淹没。
于此类似,我们可以限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离。
设置每个业务线程上限,不会导致一个业务把所有的资源都耗尽
3.3 熔断器(断路器)
断路器模式:由 断路器 统计业务执行的异常比例,如果超出阈值则会 熔断 该业务,拦截访问该业务的一切请求。
断路器会统计访问某个服务的请求数量,异常比例:
当发现访问服务C的请求异常比例过高时,认为服务C有导致雪崩的风险,会拦截访问服务C的一切请求,形成熔断:
设置异常/失败/慢调用上限,当达到上限就断开调用,再来的请求都不让调用,隔断时间之后再尝试调用,如果服务还能运行再放行,否则继续拒绝。
3.4 限流
流量控制:限制业务访问的QPS,避免服务因流量的突增而故障。
四、总结
1.什么是雪崩问题?
微服务之间相互调用,因为调用链中的一个服务故障,引起整个链路都无法访问的情况。
2.限流 是对服务的保护,避免因瞬间高并发流量而导致服务故障,进而避免雪崩。是一种 预防 措施。
3.超时处理、线程隔离、降级熔断 是在部分服务故障时,将故障控制在一定范围,避免雪崩。是一种 补救 措施。