当客户端有大量的请求同时到达,服务处理能力有限导致积压了大量的请求,随后上层服务的线程也随之阻塞,线程资源耗尽,上游服务瘫痪。具体的表现为,请求一直pending,对应的服务也不再能对外提供接口响应。
接下来是应对方式:
首先,要保证服务的稳定,就算请求积压也不能连累到上游服务,导致整个服务线崩塌。我们要采取服务保护措施:使用sentinel对服务进行保护,具体措施有:限流、熔断、降级、过滤等。
其次,要优化服务间的相互调用,即RPC远程过程调用优化:使用SpringCloud基于Feign组件实现的RPC通信;如果使用restTemplate或者HttpClient则需要优化其相关的参数;例如超时时间不宜过长,重试机制等。
最后,针对请求积压的问题从三个方面去优化:
1.尽量将客户端发送请求的资源减小、次数减少。这就需要前端进行资源压缩,接口设计优化,缓存,数据预热等手段。
2.增加单个服务处理请求的能力,有以下手段:增加tomcat配置(即优化tomcat);JVM调优;切换springboot内置servlet容器;减少服务IO;代码层面优化等等。
3.增加集群,增加服务实例,分散请求压力。
我暂时总结了这三点,肯定还有其他方面的优化,总之就一个宗旨,不要让硬件浪费,尽量让服务器成为瓶颈,而不是我们的软件。