本文转载自微信公众号「JeffckyShare」,作者Jeffcky 。转载本文请联系JeffckyShare公众号。
下面我们结合如下两个异常信息进行大致排查分析,到底什么时候会抛出这两个异常信息呢?
异常信息分析
上述异常说到底还是连接问题导致,但是连接超时有很多种情况,比如客户端主动关闭连接,又比如服务端对请求应答超时等等,这里给出仅我个人理解的常见情况,大家可以作为基本参考
大前提:根据项目实际情况,分析实际业务对应场景,主要考虑以下最后两个因素
一是,适当观察下数据量大小,万一偶尔出现数据量达到M级别呢,当然既然考虑HTTP,这种情况可以基本忽略
二是,HTTP是否还能承载对应业务,排除性能瓶颈
三是,评估考虑是否增加自身平台请求超时时间设置?同时也清楚自身平台是否存在请求非常频繁?以及也一定要了解对接方是否存在处理请求非常耗时?
首先,若以上两者都不是,可以从网络原因开始分析,比如防火墙设置(根据操作系统不同而采取对应方案)、DNS解析设置(有参数可配置刷新DNS解析)、IP设置、代理设置(有参数可配置忽略代理)等等
其次,保证启用客户端持久化连接以及增加连接数限制
- //增加保活机制,表明连接为长连接
- client.DefaultRequestHeaders.Connection.Add("keep-alive");
- //启用保活机制(保持活动超时设置为 2 小时,并将保持活动间隔设置为 1 秒。)
- ServicePointManager.SetTcpKeepAlive(true, 7200000, 1000);
- //默认连接数限制为2,增加连接数限制
- ServicePointManager.DefaultConnectionLimit = 512;
然后,依然不能解决问题,尝试使用Socket通信连接
- var client = new HttpClient(new SocketsHttpHandler()
- {
- //考虑忽略使用代理
- UseProxy = false,
- //考虑增加连接数配置
- MaxConnectionsPerServer = 100,
- //考虑忽略重定向响应
- AllowAutoRedirect = false,
- //考虑忽略SSL证书验证
- SslOptions = new SslClientAuthenticationOptions()
- {
- RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true
- },
- //考虑数据压缩设置
- AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip,
- })
- {
- BaseAddress = new Uri(""),
- Timeout = TimeSpan.FromSeconds(30),
- };
最后,还不能解决问题,若是Windows通过WireShark抓包分析,若是Linux使用tcpdump抓包,结合WireShark分析
如果其他干扰因素都已经基本排除,同时通过WireShark抓包一切正常,是不是没辙了
自信一点,适当怀疑一下HttpClient本身可能就存在这样的问题呢?
考虑在Windows和Linux系统分别测试验证,最终确认是否是HttpClient底层在两者系统上机制的有些不同,导致存在的bug呢?