龙空技术网

Gateway连接池maxIdleTime设置问题,导致使用了已关闭的连接

程序咖大姚 59

前言:

此刻朋友们对“netty客户端关闭连接”大体比较着重,看官们都需要了解一些“netty客户端关闭连接”的相关内容。那么小编同时在网络上网罗了一些关于“netty客户端关闭连接””的相关文章,希望咱们能喜欢,兄弟们一起来了解一下吧!

bug描述

2023-11-16 12:52:29 钉钉群里抛出Connection prematurely closed BEFORE response的问题

原因分析

从skywalking查看本次调用,发现请求到达网关后就直接抛出异常,并没有实际转发给下游业务服务;

从报错内容看,并不是业务代码的问题,那么就是框架本身的问题,或者框架配置的问题,按照这个思路先去看看github上的springcloud的issue,果然有相关的问题。

然后就看到这个实际上并不是gateway本身的问题,而是Reactor-Netty的问题。跟随gateway官方文档的说明发现问题的根源是:

gateway底层的netty连接池中默认连接是没有存活时间限制的,

而下游的业务服务使用的tomcat连接池是有空闲存活时间的,超出空闲时间就会关闭连接。

出现上面问题是请求来的时候刚好网关使用了与下游服务对应的连接,而这个连接刚好在这时候因为超出空闲时间主动关闭了

解决方案

按照上面的原因分析,既然是因为网关使用了下游已关闭的连接,那么只需要网关使用存活的连接进行请求就可以解决问题了。那么基于这种思路只需要做两点

设置网关层的最大空闲时间小于下游业务服务的最大空闲时间,已知tomcat默认的最大空闲时间是20s,那么网关把这个值设置的比20s小就可以,具体数值需要根据实际情况下,这里我设置为15s。设置网关获取连接的策略为LIFO,因为这种策略可以保证获取的连接最大程度上是最近刚被使用过的,也就是热点连接始终是热点连接,而始终用不到的连接就会被回收,借鉴LRU的思想。

标签: #netty客户端关闭连接