CONNECTION_RESET(什么是Connection reset)

CONNECTION_RESET(什么是Connection reset)

一、什么是Connection reset

在TCP首部中有6个标志位,其中一个标志位为RST,用于“复位”的。无论何时一个报文 段发往基准的连接( referenced connection)出现错误,TCP都会发出一个复位报文段。如果双方需要继续建立连接,那么需要重新进行三次握手建立连接。

CONNECTION_RESET(什么是Connection reset)

导致“Connection reset”的原因是服务器端因为某种原因关闭了Connection,而客户端依然在读写数据,此时服务器会返回复位标志“RST”,然后此时客户端就会提示“java.net.SocketException: Connection reset”

TCP建立连接时需要三次握手,在释放连接需要四次挥手;例如三次握手的过程如下:

1.第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;

2.第二次握手:服务器收到syn包,并会确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

3.第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

可以看到握手时会在客户端和服务器之间传递一些TCP头信息,比如ACK标志、SYN标志以及挥手时的FIN标志等。

除了以上这些常见的标志头信息,还有另外一些标志头信息,比如推标志PSH、复位标志RST等。其中复位标志RST的作用就是“复位相应的TCP连接”。

二、Connection reset的原因

导致此异常的原因,总结下来有三种情况:

1.服务器端偶尔出现了异常,导致连接关闭

解决方法:采用出错重试机制

2.服务器端和客户端使用的连接方式不一致

解决方法:服务器端和客户端使用相同的连接方式,即同时使用长连接或短连接

3.如果是HTTPS,那么还存在TLS版本不一致

解决方法:服务器端和客户端使用相同的TLS版本

三、线上问题排查过程

3.1第一阶段的

cash服务上线两天就有一条报警 connection reset的报警,第一反应就是服务重启,看发版记录,确实在报警时间段确实进行了服务发版,但是看项目代码已经做了平滑发布。

CONNECTION_RESET(什么是Connection reset)

平滑发布解决方案

方案一:spring处理(本服务采用)

Spring Boot 需要2.3及以上

server.shutdown=gracefulspring.lifecycle.timeout-per-shutdown-phase=20s

方案二:k8s处理

https://docs.spring.io/spring-boot/docs/current/reference/html/deployment.html#deployment.cloud.kubernetes.container-lifecycle

spec:  containers:  - name: "example-container"    image: "example-image"    lifecycle:      preStop:        exec:          command: ["sh", "-c", "sleep 10"]

3.2第二阶段

过了几天又出现了几次,排查继续通过看日志发现Caused by: javax.net.ssl.SSLException: Connection reset,而且目标服务没有收到请求,没有日志输出。

怀疑是ssl安全协议不一致通过https://www.ssllabs.com/ssltest/analyze.html查询域名支持的ssl版本,项目是jdk1.8默认是sslv1.2通过对比排除是ssl版本不一致导致。

CONNECTION_RESET(什么是Connection reset)

3.3第三阶段

上线15天通过日志查询发现一共出现过7次,通过发生频率,确定为网路不稳定导致。所以通过重试解决网络不稳定的问题。

CONNECTION_RESET(什么是Connection reset)

方案一:前提条件被调用接口需要做幂等处理

@Configurationpublic class FeignConfiguration {
    @Bean
    public Retryer feignRetryer() {
        return new Retryer.Default(100, 100, 2);
    }}

这样不仅仅RST异常会重试,readTimeout等异常也会重试。

方案二:

重写Retryer.Default判断报错方法是否是GET,如果是GET进行重试,其他方法不重试。

@Slf4j
public class FeignRetryer extends Retryer.Default {
    public FeignRetryer() {
        super(100, 100, 2);
    }

    @Override
    public void continueOrPropagate(RetryableException e) {
        //get 方法可以重试,其他方法不重试
        if (e.method() == Request.HttpMethod.GET) {
            super.continueOrPropagate(e);
        } else {
            throw e;
        }
    }


    @Override
    public Retryer clone() {
        return new FeignRetryer();
    }
}

@Configuration
public class FeignConfiguration {
    @Bean
    public Retryer feignRetryer() {
        return new FeignRetryer();
    }
}

仅对get接口异常重试,不区分RST异常还是其他异常,post不重试。但是如果使用不规范get也会涉及幂等问题。

方案三

这种方式比较稳妥,只对RST重试,而且当报RST后,被请求的接口是没有收到请求的,所以也不涉及幂等问题。通过递归判断异常类型和异常信息中是否包含关键字决策是否重试。

@Slf4jpublic class FeignRetryer extends Retryer.Default {
    private static final String KEYWORD = "Connection reset";

    /**     * 重试三次     */
    public FeignRetryer() {
        super(100, 100, 3);
    }

    @Override
    public void continueOrPropagate(RetryableException e) {
        if (ExceptionUtil.isExceptionCauseContainKey(e, SocketException.class,KEYWORD)) {
            super.continueOrPropagate(e);
        } else {
            throw e;
        }
    }


    @Override
    public Retryer clone() {
        return new FeignRetryer();
    }}@Configurationpublic class FeignConfiguration {
    @Bean
    public Retryer feignRetryer() {
        return new FeignRetryer();
    }}@Slf4jpublic class ExceptionUtil {
    /**     * cause 是否包含关键字key     *     * @param throwable     * @param key     * @return     */
    public static boolean isExceptionCauseContainKey(@NotNull Throwable throwable, @NotNull Class
   expectedType, String key) {
        while (throwable != null) {
            log.info("#ExceptionUtil.isExceptionCauseContainKey expectedType:{} message:{}", expectedType, throwable.getMessage());
            if (expectedType.isInstance(throwable) && throwable.getMessage().contains(key)) {
                return true;
            }
            throwable = throwable.getCause();
        }
        return false;
    }}

大家在各种异常重试时,是怎么做的呢?

欢迎在评论区分享你的观点~

关于领创集团(Advance Intelligence Group)
领创集团成立于2016年,致力于通过科技创新的本地化应用,改造和重塑金融和零售行业,以多元化的业务布局打造一个服务于消费者、企业和商户的生态圈。集团旗下包含企业业务和消费者业务两大板块,企业业务包含ADVANCE.AI和Ginee,分别为银行、金融、金融科技、零售和电商行业客户提供基于AI技术的数字身份验证、风险管理产品和全渠道电商服务解决方案;消费者业务Atome Financial包括亚洲领先的先享后付平台Atome和数字金融服务。2021年9月,领创集团宣布完成超4亿美元D轮融资,融资完成后领创集团估值已超20亿美元。

版权声明:本文内容由网友提供,该文观点仅代表作者本人。本站(http://www.liekang.com/)仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 3933150@qq.com 举报,一经查实,本站将立刻删除。

本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至907991599@qq.com 举报,一经查实,本站立即删除。本文作者:小稿,如若转载,请注明出处:https://zhubao.liekang.com/293429.html
(0)
小稿的头像小稿
上一篇 2024年1月9日 下午12:37
下一篇 2024年1月9日 下午12:38

相关推荐

  • 翡翠原石( 什么是翡翠的原石)

    点击输入图片描述(最多30字)1、翡翠原石指的是没有进行开皮的翡翠,而翡翠原料经过在矿山开采后,没有进行任何的人工处理,将其统称为翡翠原石。而翡翠原石的交易也叫做赌石,其中缅甸出产的翡翠原石品质是最好的,一直深受很多人的喜爱和追捧。2、翡翠原…

    2023年10月20日
  • 户籍所在地怎么填写(户籍所在地怎么填写?)

    户籍所在地怎么填写(户籍所在地怎么填写?) 户籍是指一个公民在出生时所随父母或祖父母、外祖父母等家庭成员一起登记在当地公安机关户籍管理部门的身份证明文件,是公民的身份证明和基本信息…

    2024年1月2日
  • 奥特曼卡哪张卡最贵,LGR乌英达姆最贵(拍出了32万的价格)

    奥特曼卡片是目前非常火的一种小玩具,不过和其他玩具不同的是,奥特曼卡片是有一个特殊的市场价格的,稀有卡片的价格非常的高,许多人还不知道奥特曼卡哪张卡最贵,目前已经卖出的最贵的奥特曼…

    2024年1月1日
  • 女人梦到大火蔓延是什么征兆(梦到大火是什么征兆 女性)

    女人梦见着火代表,五行主火,得此梦乃是丙火之象征,身边贵人运颇多,与他人间真诚相待方可有财运提升,夏天梦之吉利,秋天梦之不吉利。单身女人梦见着火,乃身边桃花运繁杂之征兆,异性关系复杂,感情多有不利之事…,以下是对”女人梦到大火蔓延是什么征兆”的详细解答!文章目录1、梦到大火是什么征兆…

    2023年12月18日
  • 2022书荒了求高质量小说完结,推荐十部顶级耐看小说言情

    2022书荒了求高质量小说完结,大家知道那些言情小说又耐看又好看吗?本篇文章就来推荐推荐十部顶级耐看小说言情。2022书荒了求高质量小说完结《如意小郎君》作者:荣小荣主角是现代双料硕士,魂穿到古代。没有系统,没有金手指,没有老爷爷,连关于这个世界的记忆都没……开篇主角重伤,落魄潦倒…

    2023年11月24日
  • 今天把水瓶座扒干净!只要水瓶不喜欢你,你在ta眼里什么都不是

    人前总是笑嘻嘻,以没心没肺的形象示人,人后玻璃心,情绪变化快,很容易哭。爱面子多过爱自己,最喜欢做的事情就是逞强。其实很害怕孤单,爱自由只是为自己单身找的借口。一直以天马行空,思维…

    2024年3月23日
  • 苏州三日游最佳推荐行程攻略

    苏州,位于江苏省东部,素有“江南水乡”之称。苏州历史悠久,文化底蕴深厚,古迹众多,是一座旅游胜地。下面,本文将为您介绍苏州三日游的必玩景点。第一天,我们可以去参观苏州的园林。苏州是中国园林之乡,被誉为“东方威尼斯”和“园林之城”。拙政园、留园、网师园和狮子林等园林都是苏州的代表性景点,其中…

    投稿 2023年11月16日
  • 生土豆汁的功效与作用

    摘要这篇文章帮你解决生土豆汁的功效与作用的问题,答案:生土豆汁的功效与作用降低血生土豆汁的功效与作用降低血脂、通便排毒、美容养颜适宜人群一般人群均适宜禁忌人群儿童辅助答案生土豆汁中含有丰富的粘液蛋白,能够降低血清胆固醇含量,从而降低血脂,可以预防高脂…

    2023年12月1日
  • 鱼腥草到底多可怕对新冠肺炎有效吗,没有效果5个副作用优质

      鱼腥草的口碑简直两极分化,要么爱,要么恶心。主要是人们接受不了它的腥味,但为什么说鱼腥草很难吃?鱼腥草到底有多可怕?鱼腥草对新冠肺炎有效吗?实际上,鱼腥草没有太多的副作用,对新…

    2023年11月4日
  • 好玩的大型手机3d格斗游戏有哪些2024 有趣的3d格斗手游推荐

    今天小编主要给大家带来非常高人气的动作格斗手游,同时都以3d的视角来展现画风,相对而言会更加真实,体验感也是比较高度自由的。当你有想要了解的好玩的大型手机3d格斗游戏有哪些2024…

    2024年3月24日