全国专业的电脑维修、笔记本维修、手机维修、家电维修回收平台!

connection_reset解决方案

编辑: 十五快修 发布时间:2023-08-01 20:44:44 浏览:
生成海报

connection_reset解决方案

Connection reset具体的解决方案有如下几种:1、出错了重试;2、客户端和服务器统一使用TCP长连接;3、客户端和服务器统一使用TCP短连接。主要是这三种connection_reset解决方案。 十五快修平台全国电脑服务

首先是出错了重试:这种方案可以简单防止“Connection reset”错误,然后如果服务不是“幂等”的则不能使用该方法;比如提交订单操作就不是幂等的,如果使用重试则可能造成重复提单。然后是客户端和服务器统一使用TCP长连接:客户端使用TCP长连接很容易配置(直接设置HttpClient就好),而服务器配置长连接就比较麻烦了,就拿tomcat来说,需要设置tomcat的maxKeepAliveRequests、connectionTimeout等参数。另外如果使用了nginx进行反向代理或负载均衡,此时也需要配置nginx以支持长连接(nginx默认是对客户端使用长连接,对服务器使用短连接)。 专注,专业就找十五快修平台

使用长连接可以避免每次建立TCP连接的三次握手而节约一定的时间,但是我这边由于是内网,客户端和服务器的3次握手很快,大约只需1ms。ping一下大约0.93ms(一次往返);三次握手也是一次往返(第三次握手不用返回)。根据80/20原理,1ms可以忽略不计;又考虑到长连接的扩展性不如短连接好、修改nginx和tomcat的配置代价很大(所有后台服务都需要修改);所以这里并没有使用长连接。 成都十五维修 十五年经验

HttpClient Connection Reset异常

1.背景

15KUAIxiu.com 电脑维修

最近项目使用HttpClient 进行服务调用,为了提高利用率,使用了HttpClient 连接池并进行了链接参数调优; 成都十五维修 十五年经验

链接池: 成都十五维修 十五年经验

PoolingHttpClientConnectionManager 

成都十五维修,全国寄修

参数: 全国寄修 十五快修平台

ConnectTimeout= 3000;链接建立的超时时间

SocketTimeout=10000; 响应超时时间,超过此时间不再读取响应;

ConnectionRequestTimeout= 3000; http clilent中从connetcion pool中获得一个connection的超时时间;

MaxPerRoute = 200

MaxTotal = 400

注意这里有个坑,连接池默认MaxTotal =2,最大仅支持两个并发;

connection_reset解决方案(图1)


2.问题

在调整了上述配置之后,发现偶尔出现Connection Reset的异常情况

3.分析过程

出现Connection Reset的原因

1.客户端在读取数据,服务端不再发送新数据(服务器主动关闭了数据)

解决:加入驱逐配置时间

evictIdleConnections(40, TimeUnit.SECONDS)

httpClient = HttpClients.custom().setDefaultRequestConfig(RequestConfig.custom().setConnectionRequestTimeout(TIMEOUT).setConnectTimeout(CONNECT_TIMEOUT).setSocketTimeout(TIMEOUT).build()).setConnectionManager(cm).evictIdleConnections(IDEL_TIMEOUT, TimeUnit.SECONDS).build();


4.带来的问题

上述配置完成后,发现运行一段时间后内存资源不足,导致服务雪崩

其实这里主要也是引入httpclient池和evictIdleConnections配置造成的,看源码


connection_reset解决方案(图2)


connection_reset解决方案(图3)


每次会new一个守护线程,这里就是造成线程资源不足的主要原因;

解决方案:

这里其实应该把httpClient 作为单例模式来处理

private static CloseableHttpClient httpClient;
@PostConstructpublic void init() {
    PoolingHttpClientConnectionManager  cm = new PoolingHttpClientConnectionManager();    if (!autoRefreshConfigBean.getMaxTotal().equals(cm.getMaxTotal()) || !autoRefreshConfigBean.getDefaultMaxPerRoute().equals(cm.getDefaultMaxPerRoute())) {
        cm.setMaxTotal(autoRefreshConfigBean.getMaxTotal());        // 将每个路由基础的连接增加
        cm.setDefaultMaxPerRoute(autoRefreshConfigBean.getDefaultMaxPerRoute());
    }
    httpClient = HttpClients.custom().setDefaultRequestConfig(RequestConfig.custom().setConnectionRequestTimeout(TIMEOUT).setConnectTimeout(CONNECT_TIMEOUT).setSocketTimeout(TIMEOUT).build()).setConnectionManager(cm).evictIdleConnections(IDEL_TIMEOUT, TimeUnit.SECONDS).build();
    log.info("=============PoolingHttpClientConnectionManager-CloseableHttpClient被初始化=============");
}
技术支持: 全国热线:15680516196或添加微信:shiwukuaixiu 提供各品牌笔记本芯片级维修,配件更换,包括外星人/苹果/微软surface全系列硬盘内存升级、电池屏幕更换(全国服务);专业技术员在线提供技术支持、故障疑问等解答!

相关信息

  • vivox90玩游戏性能测评1、游戏表现直观,用 120Hz 高画质来打王者 ,平均帧率达到 119.6fps ,2、帧率平稳没有波动,多局游戏都不会出现卡顿和
    发布时间:2024-12-02
  • 红米12忘记了锁屏密码解开方法1. 使用Google账户:如果你的红米手机绑定了Google账户,并且开启了“找回设备”功能,可以尝试通过输入错误密码多次后选择
    发布时间:2024-12-02
  • 苹果15ID密码忘记了修改方法一、MAC设备上修改1、点击屏幕左上角的 “Apple logo”。2、再点击 “system preferences”3、单击苹
    发布时间:2024-12-02
  • 小米civi3是不是直屏小米Civi3使用居中双孔柔性曲屏 ,而且在外观上,镜头模组也会位于机身的左上角。1、在外观设置上,采用居中 双孔柔性曲屏+塑料中框+后
    发布时间:2024-12-02
  • 真我gtneo5有没有耳机孔有3.5mm耳机孔 ,真我gtneo全系列都是有3.5mm耳机孔的,它能够支持连接大部分传统耳机和播放器。1、以前大部分的手机耳机使
    发布时间:2024-12-02
在线
报修
进入:在线报修系统 方便、快捷、高效
微信号:shiwukuaixiu 技术24小时在线
电话图标
156-8051-6196