postman触发任务处理,长时间未响应时,自动retry,导致SFTP连接意外中断

2023-11-15

背景

今天写了一个数据处理任务,用于后端定时触发。并为这个定时任务提供了一个触发接口,用于手动触发。
这个任务的处理逻辑,大概是从SFTP上拉取文件,并对文件进行解析。任务写完后,在测试时,数据量较少,并未发现问题。

现象

今天在正式环境手动触发任务时,由于处理时间较长,大概在30分钟左右。开始时,任务处理正常。处理了一段时间后,任务持续报异常,后台日志持续飘红。跟踪日志发现,SFTP连接被意外中断,导致任务处理失败。即使程序自动重新创建连接,仍然会被意外中断。

重试多次,现象可以复现,且均是出现在任务执行一段时间之后。

通过在任务处理的入口处增加日志,发现了问题原因。一段时间之后,后端收到了第二次任务处理的请求。第二次任务处理时,对第一次还未执行完成的任务造成了影响。

但是又有了两个问题:

  1. 第二次触发的请求是哪里来的?我用postman只触发了一次请求,且这次请求的结果还未返回。
  2. 为什么第二次的任务处理会关闭第一次的任务连接。

猜想

  1. 第二次请求
    通过观察,猜想,第二次请求是postman触发的。因请求长时间未得到响应,所以postman自动触发了一次重试。于是,我再次使用postman触发任务,并取消postman的等待响应。10分钟之后,后端未收到二次请求,且第一次任务正常执行完成。由此可知,postman在一段时间内未得到响应,将触发重试。
  2. 关闭连接
    通过查看代码发现,SFTP的连接工具类,使用的是单例模式,且共享一个连接。于是第二个任务在调用关闭处理时,第一次任务的连接也被关闭了。于是后端出现了连接意外关闭的错误。

解决方案

  1. 针对postman自动重试,如果不经常使用,可以考虑在触发任务后,手动停止postman的响应等待。但如果接口调用频繁的话,需要做特殊处理。此处提供几个思路。
  • 将任务处理包装成线程任务。在接口触发时,创建一个线程任务,另起线程执行,同时返回接口响应。对于这种方式,需要考虑接口的并发处理。
  • 使用内存锁,任务触发时,获取内存锁,如果获取到则触发任务执行,否则直接返回。该方式,可以阻断postman的自动重试。但同时也会阻止手动的重复执行,有利有弊。
  1. 针对连接异常关闭
    如果是单线程模式,则无需过多处理。
    对于并发模式,则可以考虑避免使用单例模式的连接管理。考虑将SFTP的连接进行池化管理。采用连接池,可以避免不同任务中的连接影响。

2022/11/23 更新
这个问题,后来做了一些优化,同步一下,仅供参考:

  1. 如果接口只希望单线程处理,则增加内存锁,防止并发,如上文中所说。
  2. 如果接口希望可以支持多线程并发处理,则需要对接口做相应改造。改造方案如下:
    • SFTP 连接进行池化处理(最优解法)
      池化处理的SFTP连接,避免在业务代码中进行SFTP连接和关闭处理,从而一劳永逸的支持代码的并发处理。
    • SFTP 连接关闭时,进行判断后关闭
      如果不进行池化处理,则可以采用在连接关闭时,判断是否还有未完成的处理线程,如果有,则不关闭的。让最后处理完的线程关闭连接。此种方式,能简单修复,但应对并发处理时,显得不够优雅。且在高并发场景下,依然存在问题。
    • 使用线程变量 ThreadLocal
      使用现成变量,让每个线程都去建立一个连接,而不是多个线程复用连接。这种方式存在风险,如果线程开启数量超过了SFTP允许的连接数,可能导致连接失败。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

postman触发任务处理,长时间未响应时,自动retry,导致SFTP连接意外中断 的相关文章

随机推荐

  • linux bmc管理(工作笔记,随时更新)

    ipmi使用 概述 1 修改bmc IP地址 2 修改bmc 用户信息 概述 在日常工作中 对机器bmc配置一般是连接显示器进行相应配置 通过ipmi进行bmc的配置可以实现在系统下进行bmc的配置 从而实现对多台服务器进行bmc的配置 大
  • 记一次umi开发后台管理系统的基础使用

    先介绍一个umi 阿里开源的一个企业级可插拔的react脚手架 umi相对比react官方推荐的脚手架更加的简单 更贴近vue cli的使用感受 而本文仅仅介绍基础使用方法 高手请绕行 开发展示 仿叮咚买菜后台管理系统预览 http din
  • 抖音短视频矩阵号系统开发者开源部署分享(一)

    抖音是一款备受欢迎的短视频APP 拥有数亿的用户 其中包括了大量的粉丝 为了让更多的人能够发现和观看到你的视频 抖音SEO是必不可少的一环 特别是对于拥有企业或个人品牌的用户来说 在这个过程中 抖音SEO源码的开源部署显得尤为重要 首先 我
  • 2022年11月计划(cesium for ue源码抄写+ socket视频学习+ue4 tf视频学习)

    根据规划 进行cesium for ue源码抄写 网络视频教程 ue4 tf1视频学习
  • VSCode SFTP 文件同步配置中监听文件删除或新增包含子目录的文件 watcher配置

    name aaaaa host 321312321 protocol sftp port 22 username 123321 password 123321 remotePath www wwwroot web uploadOnSave
  • 关于Geany编写python中文注释时报错的解决办法

    关于Geany编写python中文注释时报错的解决办法 其实这个方法很简单 首先打开Geany 新建或者打开一python文件 然后在 文档 中选择 设置文件编码 的 Unicode 里面的 UTF 8 就好了 注意 这种方只能在你所正在编
  • EXCEL 怎么用函数公式计数(Excel函数去重计数 / 去除重复项),不使用透视表

    起因 因领导层需要将电商平台利润核算自动化 原始数据不可以动 所以需要用到公式 PS 其实所谓自动化不是Python VBA办公自动化 就是嵌套一堆公式 然后每月更新电商后台基础数据 就可以出来利润结果 正文 普通方法1 直接使用 SUM
  • RHEL6 系统启动故障排错

    RHEL6 系统排错 系统故障了 机器无法正常工作 更别提正常提供服务 这个时候如果我们掌握了系统排错 那就大有用武之地了 我们在学习和实验阶段 可以通过系统排错帮助大家更深入了解系统启动过程 对系统进行如下破坏 1 破坏grub引导 dd
  • Docker 安装部署与基础操作

    Docker 是一个开源的商业产品 有两个版本 社区版 Community Edition 缩写为 CE 和企业版 Enterprise Edition 缩写为 EE 企业版包含了一些收费服务 个人开发者一般用不到 下面的介绍都针对社区版
  • SQL优化 之 百万数据真实案例教程0基础(小白必看)

    前提准备 本案例准备了100W的数据进行SQL性能测试 数据库采用的是MySQL 总共介绍了常见的14种SQL优化方式 每一种优化方式都进行了实打实的测试 逐行讲解 通俗易懂 一 前提准备 提前准备一张学生表数据和一张特殊学生表数据 用于后
  • LTE频段(band)划分

    1 TDD LTE 国内使用的TDD包括B38 B39 B40 B41 其中B38是B41的子集 国内运营商频段划分如下 其中移动B40 联通电信B41频段为室内补充频段 联通电信定制机均不支持B40频段 基本可以解读为该频段目前被联通电信
  • Java概述

    Java 简介 一个苦逼的建筑专业的Java小白 什么是 Java Java 是一门面向对象编程语言 不仅吸收了 C 语言的各种优点 还摒弃了 C 里难以理解的多继承 指针等概念 因此 Java 语言具有功能强大和简单易用两个特征 Java
  • Hive【Hive(一)DDL】

    前置准备 需要启动 Hadoop 集群 因为我们 Hive 是在 Hadoop 集群之上运行的 从DataGrip 或者其他外部终端连接 Hive 需要先打开 Hive 的 metastore 进程和 hiveserver2 进程 meta
  • 深度之眼Paper带读笔记NLP.10:DCNN

    文章目录 前言 第一课 论文导读 句子建模简介 词表征Word Representation 基于分布式相似性的表征Distributional Similarity based representations 基于窗口的共现矩阵Windo
  • 《汽车行业面向智能制造的BOM物料管理》拆书心得—第三章 企业级BOM架构探讨

    各企业对各种BOM形态叫法不一 为后续探讨方便 首先从业界较流行的叫法来定义各BOM形态 明确各形态BOM的内涵 服务对象及作用 这些BOM形态包括早期BOM Early BOM 工程BOM Engineering BOM EBOM CAD
  • 接口测试工具Apifox 基础篇:公共脚本

    一 公共脚本的使用背景 1 实现脚本复用 避免多处重复编写相同功能的脚本 2 相同功能的脚本或通用类 方法可放到公共脚本中供接口直接引用 二 使用方式 1 管理公共脚本 打开 项目设置 gt 公共脚本 在这里管理公共脚本 2 引用公共脚本
  • npm 升级

    更新到最新版本 npm install g npm 更新到指定版本 npm g install npm 8 0 0 清理 npm 缓存数据 npm cache clean force
  • 原生js 选择文件,获取 input type=file 时候的文件路径

    使用 URL createObjectURL 方法来获取文件的路径 div div
  • 【以太坊源码】以太坊黄皮书参数

    由于参数比较多 直接贴出来比较杂乱 我将其整理在百度脑图 按照黄皮书章节顺序进行分类 并调整了部分常数顺序 需要查阅特定的参数 可以使用ctrl F直接查询 由于百度脑图不支持下标 或者我不知道 所有参数统一没用下标 并在备注中说明是否有下
  • postman触发任务处理,长时间未响应时,自动retry,导致SFTP连接意外中断

    背景 今天写了一个数据处理任务 用于后端定时触发 并为这个定时任务提供了一个触发接口 用于手动触发 这个任务的处理逻辑 大概是从SFTP上拉取文件 并对文件进行解析 任务写完后 在测试时 数据量较少 并未发现问题 现象 今天在正式环境手动触