背景:Springboot服务端业务代码中包含HttpClient请求第三方的接口,由于第三方要求,将超时时间设置40S。另外在业务代码中有操作数据库的动作,所以同时创建了事务。
问题:当第三方接口出现问题,大量客户端请求服务开始堆积,客户端超时(5S)后,导致服务端TCP被动关闭链接,产生大量的CLOSE_WAIT的链接,同时,由于代码中包含HttpClient长时间的请求等待及操作数据库的事务不断创建,中间发生了死锁现象(数据库是sqlserver,高并发下select和update的操作导致了死锁),表被锁死,以致服务彻底假死。
解决办法:
1、使用HttpClient连接池(使用监控线程,定时回收和关闭无效链接)
2、去除事务(包含有HttpClient的业务逻辑中尽量不使用事务)
3、Linux服务TCP/IP配置调优。
相关代码就不展示了,只提供下思路。