首页 > 其他分享 >记一次奇葩接口

记一次奇葩接口

时间:2023-08-17 14:58:12浏览次数:49  
标签:一次 请求 接口 重试 error retryCount 超时 奇葩 1000

1.回传接口要求

第一次遇到这么奇葩的API接口回传要求:

  1. HTTP Status为500、1000、或者超时、响应慢都要重试
  2. 前10分钟每30s重试一次。后续每5分钟重试一次。如果12小时还未成功直接丢弃数据

你说数据重要嘛,你后面又不要了,说不重要嘛12h的重试。。。所以避免折腾,所有丢弃的数据还是得本地记录下日志

2.思路历程

一开始是用定时任务来处理,后来说太麻烦,让前端解决。。。

得写个计时器完事。后来又说逻辑太复杂,要简单便于维护。。。

那好,直接使用axiosRetry,咱们也不搞啥算法了,就给它指定一个自定义的retryDelay函数

也不要那么多复杂逻辑了,直接给您算好大概重试多少次,比如说:

// 添加axios-retry插件,配置重试策略
axiosRetry(jdRetryAxios, {
    retries: 100, // 重试次数:差不多得了,它让你24h你还真24h重试不成?  
    retryDelay: (retryCount) => {
        console.debug('retryCount:', retryCount);
        if (retryCount <= 19) { // 前10分钟,每30s重试一次 ==> 20次
            return 30000; // 30 * 1000;
        } else { // 后续重试时间间隔每次间隔5分钟,最长12小时 ==> 144次
            return 300000; //5 * 60 * 1000;
        }
    },
    shouldResetTimeout: true, // 每次重试都重置超时时间
    // 自定义条件,针对状态为500、1000、超时、网络问题进行重试
    retryCondition: (error) => {
        console.debug('retry touch:', error);
        return error?.response?.status === 500 || // JD服务器内部错误
            error?.response?.status === 1000 || // JD服务器内部错误
            error?.code === 'ECONNABORTED' || // 后端响应超时
            error?.code == 'ERR_NETWORK'; // 网络异常
    },
});

3.潜在风险

但这种其实有2个潜在的问题:

1.有些请求其实只是响应超时,并不代表服务器没有响应

PS:等它来得及的时候就会一下把你之前的重试都响应给你了,你得鉴别,eg:token、timestamp

2.客户端可能会多次post请求,那你就要想办法去重

PS:这种反馈统计的一般都不会让你点,往往是程序自己后台默默去做的事情那事件就别暴露的那么明显了。就算是让点的,那你至少把个按钮变为禁用状态(可以多少时间后恢复)

解决多次请求的问题其实可以通过前后端来共同处理:(主要还是后端处理,前端是尽量避免和延缓)

  1. 比如UI层面的禁用和多长时间恢复
  2. 比如每个请求都可以带上一个时间戳,后端只要看到时间戳超过5s/10s的直接拒掉了(超时拒绝响应
    1. PS:这个最简单,尤其是对于服务器配置不高的情况。除了这种方法,还可以通过限流算法来处理
  3. 再比如前端在请求前搞个类似hash或者队列的数据结构,同一个连接别陆续请求多次,后端类似于ResponseCache的东西,让浏览器对相同请求进行缓存下
  4. 再比如后端通过各种缓存(eg:redis)、令牌桶之类的限流算法来处理

不扯了,先这样

标签:一次,请求,接口,重试,error,retryCount,超时,奇葩,1000
From: https://www.cnblogs.com/dotnetcrazy/p/17637549.html

相关文章

  • Feign接口返回值加多层泛型,但没有反序列化彻底
    1、问题描述接口返回值加多层泛型,但没有反序列化彻底2、问题原因jackson-databindjar包版本的问题我们之前用的是2.11.2,这个版本有bug,版本变成2.11.3就好了......
  • 关于API数据接口获取商品的数据的说明
    获取商品数据已经成为许多应用程序的重要组成部分。为了实现这一目标,许多公司和技术开发者使用API数据接口来获取相关数据。本文将详细介绍如何使用API数据接口获取商品数据,并使用Python作为编程语言示例来展示相关代码。API数据接口是一种通信协议,它允许不同的应用程序或服务之间......
  • 接口返回图片使用什么类型_JavaWeb
    publicResponseEntity<byte[]>icon(){//第三方接口返回的图片验证码ResponseEntity<byte[]>response=restTemplate.getForEntity(url,byte[].class);……//由后端转发此请求,是因为此处需要做一些特殊处理......
  • 记一次MySQL死锁问题排查
    事情的起因:我司有一款应用处于新旧系统切换阶段,新旧服务同时穿插运行,新服务不断迭代的同时来不断下线旧服务,其中有一个编辑客户信息的功能因为工作量太大,所以其中一部分内容是通过RPC的方式调用新服务的API进行保存的,然后在出现了一个神奇的问题,RPC接口频繁超时,于是我对RPC接口......
  • 记录一次内网渗透过程
    记录一次内网渗透过程0x01前言:一切以学习为主,记录一次小小的攻击过程本次是通过外网漏洞撕开的口子,主要通过一下方式拿到了目标资产nday扫一扫弱口令爆一爆上传接口找一找后台上传找一找数据库弱口令关注新day,有了立马在资产里面跑一下逻辑漏洞什么的就不要了,只要能g......
  • applicationrunner用法 是一个方便的接口,可以用于在应用程序启动后执行一些逻辑,比如数
    applicationrunner用法原文链接:https://wenku.csdn.net/answer/d8f7f4398bc786e79ed79f09b540878fApplicationRunner是SpringBoot中的一个用于运行应用程序的类。它可以帮助你快速启动和运行你的应用程序,而不需要写很多代码。你可以通过实现ApplicationRunner接口并重写run方法......
  • 通过微软Azure调用GPT的接口API-兼容平替OpenAI官方的注意事项
    众所周知,我们是访问不通OpenAI官方服务的,但是我们可以自己通过代理或者使用第三方代理访问接口现在新出台的规定禁止使用境外的AI大模型接口对境内客户使用,所以我们需要使用国内的大模型接口国内的效果真的很差,现在如果想使用GPT大模型,可以使用微软Azure的OpenAI服务。 负责......
  • 记录一次从surface go2恢复镜像相关的
    终端管理员切换目录不成功在cd后加'/d'合并swm文件【图片】【合并SWM、合并WIM】【wim吧】_百度贴吧(baidu.com)查看swm信息dism/get-wiminfo/wimfile:D:\苏菲\SurfaceGo2_BMR_42132_9.33.4\sources\install.swm导出swm为wimdism/export-image/sourceimagefile......
  • NCCL接口测试
    准备知识PyTorch分布式通信的程序包相关的API。torch.distributed.init_process_group(),初始化进程组。torch.distributed.get_rank(),可以获得当前进程的rank,rank%torch.torch.cuda.device_count()可以得到当前节点的ranklocal_rank。torch.distributed.get_world_size()......
  • java实现一个什么都没有的接口有什么用呢?
    在Java中,一个完全没有方法定义的接口被称为标记接口(MarkerInterface)。标记接口不包含任何方法,但它们在代码中传达了某种含义或元信息。它们有以下几种主要用途:语义约定:通过实现一个特定的标记接口,类可以明确地表示它具有某种特性或行为,即使该接口没有定义任何方法。当你看到一个类......