一、什么是服务雪崩效应?
默认情况下tomcat只有一个线程池去处理客户端发送的所有请求,在高并发情况下,如果客户端所有的请求堆积到同一个服务接口上,tomcat的所有线程去处理该服务接口,会导致其他服务接口产生延迟等待,无法访问。
二、雪崩效应产生的几种场景
- 流量激增:比如异常流量、用户重试导致系统负载升高;
- 缓存刷新:假设A为client端,B为Server端,假设A系统请求都流向B系统,请求超出了B系统的承载能力,就会造成B系统崩溃;
- 程序有Bug:代码循环调用的逻辑问题,资源未释放引起的内存泄漏等问题;
- 硬件故障:比如宕机,机房断电,光纤被挖断等。
- 线程同步等待:系统间经常采用同步服务调用模式,核心服务和非核心服务共用一个线程池和消息队列。如果一个核心业务线程调用非核心线程,这个非核心线程交由第三方系统完成,当第三方系统本身出现问题,导致核心线程阻塞,一直处于等待状态,而进程间的调用是有超时限制的,最终这条线程将断掉,也可能引发雪崩;
三、雪崩效应的常见解决方案
针对上述雪崩情景,有很多应对方案,但没有一个万能的模式能够应对所有场景。
针对流量激增,采用自动扩缩容以应对突发流量,或在负载均衡器上安装限流模块。
针对缓存刷新,参考Cache应用中的服务过载案例研究
针对硬件故障,多机房容灾,跨机房路由,异地多活等。
针对同步等待,使用Hystrix做故障隔离,熔断器机制等可以解决依赖服务不可用的问题。
通过实践发现,线程同步等待是最常见引发的雪崩效应的场景,本文将重点介绍使用Hystrix技术解决服务的雪崩问题。
四、feign配置客户端超时时间
###设置feign客户端超时时间
ribbon:
###指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间。
ReadTimeout: 5000
###指的是建立连接后从服务器读取到可用资源所用的时间。
ConnectTimeout: 5000