connection reset by beer问题排查

本文介绍了在不同服务器间通信时遇到的'ConnectionResetByPeer'异常,该异常通常发生在一端关闭Socket后,另一端仍尝试读写数据时。在作者的案例中,由于Elasticsearch客户端长时间未与集群交互,导致连接被单方面关闭。为解决这个问题,作者自定义了连接保持策略,将客户端的连接保活时间缩短至30分钟,并在设置HttpClient配置时应用该策略,从而避免了异常的发生。
摘要由CSDN通过智能技术生成

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

首先时触发原因

  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);

至此解决问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "Connection Reset by Beer" 是一个网络错误提示,通常是指在进行网络连接中出现问题。 它是一个幽默而又搞笑的错误提示,意思是与服务器的连接被啤酒瓶敲碎或弄乱了。尽管它不是一个正式的错误消息,但它常常出现在网页或应用程序无法连接到服务器的情况下。 实际上,这个错误提示是一种开发者或网络管理员通过添加幽默元素来调侃错误而创造的。它的目的是为了让用户在遇到问题时感到放松和愉快,同时不至于陷入沮丧或挫败。 当用户看到这个错误提示时,通常意味着与目标服务器的网络连接被断开或中断。这可能是由于网络故障、服务器故障、软件冲突或其他原因造成的。 为了解决这个问题,用户可以尝试以下几个解决方法: 1. 检查网络连接:确保自己的网络连接正常,可以尝试重新连接网络或重启路由器。 2. 检查服务器状态:如果错误提示在特定的网站上出现,可能是服务器出现问题。可以尝试刷新页面或稍后再试。 3. 清除缓存和Cookie:有时候缓存数据或Cookie可能导致连接问题,可以尝试清除浏览器缓存和Cookie。 4. 更新软件:确保自己的应用程序或浏览器是最新的版本,有时旧版本软件也会导致连接问题。 如果上述方法都无效,可能需要联系网站管理员或网络服务提供商以获取进一步的帮助。 总之,“Connection Reset by Beer” 是一个幽默的网络错误提示,提示用户与服务器的连接被中断。改善网络连接或与相关方沟通可能有助于解决问题。 ### 回答2: “connection reset by beer”是一个非正式的网络术语,用于描述在网络连接过程中因为喝醉而导致连接重置的情况。这种情况通常是由于网络传输中的错误、数据包丢失或者网络不稳定引起的。 在网络通信中,当两台计算机建立连接时,会进行一系列的握手过程以确保连接的稳定和可靠性。然而,如果其中一方因为饮酒过度而没有正常响应网络请求,或者网络信号不稳定导致数据传输中断,那么连接就会被重置。 "connection reset by beer"常用于幽默的网络讨论中,用于描绘在网络连接过程中的意外情况。它传达了一个类比的概念,即酒精影响了人的判断力和行为,就像在网络连接中发生错误一样。 尽管这个词组在幽默方面很有趣,但在实际的网络通信中,连接重置通常是由于技术或网络问题引起的,而不是因为喝醉。所以,当我们遇到“connection reset by beer”这个术语时,我们应该以幽默的心态对待,并寻找真正的原因来解决连接问题。 ### 回答3: "Connection reset by beer" 是一句开玩笑的短语,意指在网络通信时连接被重置或中断。使用这个词语的背后是一种幽默的说法,将网络故障与喝酒联系在一起。 虽然在技术上没有与啤酒直接相关的连接重置问题,但这句话是网络工程师或程序员之间的幽默术语,常用于形容在进行网络通信时突然出现连接中断的情况。 这种表达方式是为了使用幽默来缓解技术问题的紧张气氛,通过加入啤酒一词使得描述更加生动有趣。同时,也暗示了在处理技术问题时,有时候一个小的失误或突发状况可能导致连接的问题出现。 总之,“Connection reset by beer” 并不是一个真正的错误信息,而是一种幽默的说法,用于描绘网络通信中连接出现问题的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值