记一次奇葩接口 ~ 失败重试12小时

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)、令牌桶之类的限流算法来处理

不扯了,先这样

【源码免费下载链接】:https://renmaiwang.cn/s/os2te 大整数乘法是计算机科学中的一个重要领域,特别是在算法设计和数学计算中有着广泛应用。它涉及到处理超过标准整型变量范围的数值运算。在C++编程语言中,处理大整数通常需要自定义数据结构和算法,因为内置的`int`、`long long`等类型无法满足大整数的存储和计算需求。以下是对这个主题的详细阐述:1. **大整数数据结构**: 在C++中,实现大整数通常采用数组或链表来存储每一位数字。例如,可以使用一个动态分配的数组,每个元素表示一个位上的数字,从低位到高位排列。这种数据结构允许我们方便地进行加减乘除等操作。2. **乘法算法**: - **暴力乘法**:最直观的方法是类似于小学的竖式乘法,但效率较低,时间复杂度为O(n^2)。 - **Karatsuba算法**:由Alexander Karatsuba提出,将两个n位数的乘法转化为三个较小的乘法,时间复杂度为O(n^1.585)。 - **Toom-Cook算法**:比Karatsuba更通用,通过多项式插值和分解进行计算,有不同的变体,如Toom-3、Toom-4等。 - **快速傅里叶变换(FFT)**:当处理的大整数可以看作是多项式系数时,可以利用FFT进行高效的乘法,时间复杂度为O(n log n)。FFT在数论和密码学中尤其重要。3. **算法实现**: 实现这些算法时,需要考虑如何处理进位、溢出等问题,以及如何优化代码以提高效率。例如,使用位操作可以加速某些步骤,同时要确保代码的正确性和可读性。4. **源代码分析**: "大整数乘法全解"的源代码应包含了上述算法的实现,可能还包括了测试用例和性能比较。通过阅读源码,我们可以学习如何将理论算法转化为实际的程序,并理解各种优化技巧。5. **加说明**: 通常,源代码附带的说明会解释
内容概要:本文详细介绍了一个基于Java与Vue技术栈的向量数据库语义检索与相似文档查重系统的设计与实现。系统通过集成BERT等深度学习模型将文本转化为高维语义向量,利用Milvus等向量数据库实现高效存储与近似最近邻检索,结合前后端分离架构完成从文档上传、向量化处理、查重分析到结果可视化的完整流程。项目涵盖需求分析、系统架构设计、数据库建模、API接口规范、前后端代码实现及部署运维等多个方面,并提供了完整的代码示例和模块说明,支持多格式文档解析、智能分段、自适应查重阈值、高亮比对报告生成等功能,具备高扩展性、安全性和多场景适用能力。; 适合人群:具备一定Java和Vue开发基础的软件工程师、系统架构师以及从事自然语言处理、知识管理、内容安全等相关领域的技术人员,尤其适合高校、科研机构、企业IT部门中参与智能文档管理系统开发的专业人员。; 使用场景及目标:①应用于学术论文查重、企业知识产权保护、网络内容监控、政务档案管理等需要高精度语义比对的场景;②实现深层语义理解下的文档查重,解决传统关键词匹配无法识别语义改写的问题;③构建可扩展、高可用的智能语义检索平台,服务于多行业数字化转型需求。; 阅读建议:建议读者结合提供的完整代码结构与数据库设计进行实践操作,重点关注文本向量化、向量数据库集成、前后端协同逻辑及安全权限控制等核心模块。在学习过程中应逐步部署运行系统,调试关键接口,深入理解语义检索与查重机制的工作原理,并可根据实际业务需求进行功能扩展与模型优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值