这里会先写触发原因,然后结合我的具体事例,并给出解决方案

首先时触发原因

  1. 如果一端的Socket被关闭(或主动关闭,或因为异常退出而 引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。
    Socket默认连接60秒,60秒之内没有进行心跳交互,即读写数据,就会自动关闭连接。
  2. 一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection reset)。

简单的说就是在连接断开后的读和写操作引起的。

不同局域网的不同服务器之间调用的时候(这里可以把请求方作为客户端,另一方作为服务端) 两端通信的时候 服务端一方将通道关闭 而另一方客户端未接收关闭的命令 下次一次客户端请求依旧采用该通道,而服务器那边此通道已经关闭,所以导致如此

下面说一下我这里碰到的具体问题,服务中集成使用到Elaticsearch,每天深夜的时候报错connection reset by beer。

具体排查发现是,当搜索模块长时间未被使用时,也就是服务中集成的elaticsearch(客户端)长时间没有去向elaticsearch集群去调用请求,导致之前的通道被单方面关闭,而另一方未收到关闭信息。在这个情况下未收到关闭信息的一方后续调用请求的时候,再次使用之前的通道去请求,就会报这个错误。

解决方案 将客户端的通道保持时间 缩短小于客户端保持时间 keepalive时间

  1. 先设置好客户端链接的心跳策略
public class CustomConnectionKeepAliveStrategy extends DefaultConnectionKeepAliveStrategy {public static final CustomConnectionKeepAliveStrategy INSTANCE = new CustomConnectionKeepAliveStrategy();private CustomConnectionKeepAliveStrategy() {super();
}/**
* 最大keep alive的时间(分钟)
* 这里默认为10分钟,可以根据实际情况设置。可以观察客户端机器状态为TIME_WAIT的TCP连接数,如果太多,可以增大此值。
*/
private final long MAX_KEEP_ALIVE_MINUTES = 30;@Override
public long getKeepAliveDuration(HttpResponse response, HttpContext context) {long keepAliveDuration = super.getKeepAliveDuration(response, context);
// <0 为无限期keepalive
// 将无限期替换成一个默认的时间
if(keepAliveDuration < 0){return TimeUnit.MINUTES.toMillis(MAX_KEEP_ALIVE_MINUTES);
}
return keepAliveDuration;
}
}
  1. 在设置setHttpClientConfigCallback es的客户端配置回调的时候加上心跳策略
/**
* 设置ES客户端连接保活时长
*/
httpClientBuilder.setKeepAliveStrategy(CustomConnectionKeepAliveStrategy.INSTANCE);

至此解决问题。

connection reset by beer问题排查相关推荐

  1. 一次SocketException:Connection reset 异常排查

    一次SocketException:Connection reset 异常排查 参考文章: (1)一次SocketException:Connection reset 异常排查 (2)https:// ...

  2. 【Nignx】 nginx启动http服务,报错 curl: (56) Recv failure: Connection reset by peer

    背景 docker 启动的nginx 服务,容器内端口80,映射到容器外8080,通过 curl -L -I http://xxxx:8080 报错 curl: (56) Recv failure: ...

  3. 分析connection reset by peer, socket write error错误原因

    上次写<connection reset by peer, socket write error问题排查>已经过去大半年,当时把问题"敷衍"过去了. 但是此后每隔一段时 ...

  4. nginx php 104,记一次nginx 502排错经历:recv() failed (104: Connection reset by peer)

    开发了一个新项目,开发环境完全正常,部署至测试环境时,直接报502,换了几台测试机器,有正常的也有依然报502的-- 环境 开发.测试.生产环境均是CentOS 6.8的系统,Web环境是nginx+ ...

  5. 重新分析connection reset by peer, socket write error错误原因

    上次写<connection reset by peer, socket write error问题排查>已经过去大半年,当时把问题"敷衍"过去了. 但是此后每隔一段时 ...

  6. 连接重置Connection reset异常

    详细信息 java.net.SocketException: Connection resetat java.net.SocketInputStream.read(SocketInputStream. ...

  7. 通过SSH访问电信天翼云服务器,报ssh_exchange_identification: read: Connection reset by peer的解决方法

    一.问题现象 业务部门人员反馈通过公司网络访问电信天翼云服务器,报ssh_exchange_identification: read: Connection reset by peer,但是通过手机热 ...

  8. Connection reset原因分析及解决思路

    Connection reset原因分析及解决思路 - lwli - 博客园 我们在开发过程中经常会出现Connection reset问题,包括http调用,数据库连接等场景.出现Connectio ...

  9. 诡异的Connection reset

    场景: 开发反馈测试环境A应用通过httpclient连接B应用,偶发java.net.socketException: connection reset报错. 理解 Connection reset ...

  10. Connection reset by peer (秒懂)

    疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 面试必备 + 面试必备 [博客园总入口 ] 疯狂创客圈 经典图书 : <Sprin ...

最新文章

  1. MyBatis-Plus为啥这么牛?
  2. 偏差是什么?一文读懂偏差
  3. Google的Java开发规范
  4. 机器学习笔记(六)支持向量机
  5. android最恶心的是什么?
  6. like效率 regexp_Oracle 中like效率 正则表达式 浅析
  7. .post与 .ajax,关于post与ajax post的数据类型
  8. C++ 双端队列deque
  9. readline安装
  10. 从 SQL Server 到 MySQL (三):愚公移山 - 开源力量
  11. python中math.log注意点
  12. java中的设计模式
  13. js对文字的修饰 big() small() fixed() toUpperCase() toLowerCase()
  14. iOS开发UI篇—简单的浏览器查看程序
  15. anaconda 安装包 超时_vs2010nuget安装包时 操作超时
  16. MindSpore,易用性提升的思考与实践
  17. 2021年危险化学品经营单位安全管理人员考试题及危险化学品经营单位安全管理人员模拟试题
  18. Starbound正式版的Mod制作(二)nbsp;…
  19. python中ospathjoin_python-在Windows上与os.path.join混合斜杠
  20. 基于Proteus基本元器件的认识

热门文章

  1. 我用FreeMind
  2. fetch.php是什么意思,fetch什么意思
  3. 投影幕布尺寸计算器_投影幕尺寸是怎么算的
  4. Arduino Pro IDE,你终于长大了!
  5. 手机的1G,2G,3G和4G区别识记
  6. 狂神说Vue笔记整理
  7. 如何写好工作日报,周报,月报?
  8. JVM-深入理解JVM内存模型、类加载机制、内存分配机制
  9. GRE Over IPSec技术
  10. Markdown离线编辑器